液晶12864的显示程序

液晶12864的显示程序,第1张

/打点/

void point(uchar x,uchar y)

{

uchar y1,hang,lie,msb_data,lsb_data,temp=0x01;

if(y1!=y)

{

msb_data=0;

lsb_data=0;

}

y1=y;

if(y<32)

{

hang=0x80+y;

lie=0x80;

}

if(y>31)

{

hang=0x80+y-32;

lie=0x88;

}

if(y>63)//return;

{

lcm_com(0x80);

_nop_();

hanzi("温度超出显示范围");

while(1)

flash();

}

lie=lie+x/16;

if(x%16==0)

{

msb_data=0;

lsb_data=0;

}

if(x%16<8)

{

msb_data=msb_data|(temp<<(7-x%16));

lsb_data=0x00|lsb_data;

}//保留以前的数据,把第x个点亮

if(x%16==8)

{

msb_data=msb_data|0x00;

lsb_data=lsb_data|0x80;

}

if(x%16>8) 大于24小于32

{

msb_data=msb_data|0x00;

lsb_data=lsb_data|(temp<<(15-x%16));

}

lcm_com(0x34);//扩充指令集

lcm_com(hang);

lcm_com(lie);

lcm_dat(msb_data);

lcm_dat(lsb_data);

lcm_com(0x36);//绘图显示开

}

ASSUME CS:CODE, DS:DATA

DATA SEGMENT

MSG1 DB 13, 10, 'Please input string: ', 13, 10, '$'

IN_MAX DB 8

IN_N DB

IN_BUF DB 10 DUP()

MSG2 DB 90 DUP('$')

DATA ENDS

CODE SEGMENT

START:

MOV AX, DATA

MOV DS, AX

;---------------------------

LEA DX, MSG1

MOV AH, 9

INT 21H

LEA DX, IN_MAX

MOV AH, 10

INT 21H

CMP IN_N, 0

JZ EXIT

;---------------------------

RIGHT:

MOV SI, 0

MOV DI, 0

MOV BYTE PTR MSG2[BX - 1], ' '

ADD DI, BX

CALL UP_DISP

LEA DX, MSG2

MOV AH, 9

INT 21H

MOV AH, 2

MOV DL, 13

INT 21H

INC BX

CALL DELAY

CMP DI, 80

JNZ RIGHT

;---------------------------

EXIT:

MOV AH, 4CH

INT 21H

;---------------------------

UP_DISP:

MOV CH, 0

MOV CL, IN_N

LP1:

MOV AL, IN_BUF[SI]

MOV MSG2[DI], AL

INC SI

INC DI

CMP DI, 80

JZ EXIT_UP

LOOP LP1

EXIT_UP:

RET

;---------------------------

DELAY:

PUSH CX

PUSH DX

MOV DX, 1000

DL1:

LOOP $

DEC DX

CMP DX, 0

JNZ DL1

POP DX

POP CX

RET

;---------------------------

CODE ENDS

END START

1、用C语言绘制图形界面

EasyX图形库(>

包含库#include <graphicsh>

先初始化图形窗口

initgraph(WINDOW_WIDTH, WINDOW_HIGH) ;WINDOW_WIDTH为窗口的宽带,WINDOW_HIGH为窗口的高度。

清空绘图设备

cleardevice();

设置画笔颜色

setcolor(RED) ;

设置线条风格

setlinestyle(PS_SOLID, NULL, 0);

画矩形

rectangle

还有画线、显示文字等函数,可以参照其帮助文档。

注意:由于我们用的是EasyX图形库,故源文件后缀要为cpp,但其中内容都是C的语法。

2、存储表示出俄罗斯方块的形状

一、我们可以用编号,不同的编号代表不同的俄罗斯方块,根据编号把不同方块的画法写在代码中,这样19种

方块就得有19种相应的代码来描绘。而且这样扩展性不好,若以后设计了新的方块,则需要更改大量源代码。

二、我们很自然的想到可用字模点阵的形式来表示,即设置一个4行4列的数组,元素置1即代表这个位置有小

方块,元素置0即代表这个位置无小方块,这个整个的44的数组组成俄罗斯方块的形状。

1000

1000

1100

0000

这个方法挺靠谱,但我们还可以优化一下:不用44的数组,而是用16个bit位来表示这个点阵。这样存储起来比较方便,故我们用unsigned int 的低16位来表示方块的点阵。

我们可以用掩码与表示俄罗斯方块的位进行 *** 作,来识别并在屏幕上画出方块。

我们把俄罗斯方块点阵的数位存在rockArray中,我们可以事先把这19种方块的字模点阵自己转化成十六进制,然后在rockArray数组的初始化时赋值进去。

但这样做未免有点太费力,且扩展性也不太好,若以后设计的新方块种类加入,要改变数组rockArray中的值。

我们可以考虑把所有俄罗斯方块的点阵存储在配置文件中,在程序初始化时读取文件,把这些点阵转换成unsigned int的变量存储在rockArray中。

这样,以后我们增添新的方块形状只需要在配置文件中增加新的点阵即可。

@###

@###

@@##

####   (为使得看起来更醒目,我们用@表示1,用#表示0)

3、让图形动起来

在某位置处用函数DrawRock在屏幕上画出俄罗斯方块,然后再擦除掉(即用背景色在原位置处重绘一次方块),最后在下落的下一个位置处用函数DrawRock在屏幕上画出俄罗斯方块,如此循环,中间用计时器间隔一段时间以控制下落的速度。

同理,按下屏幕的左右键也是如此,只是在按下键盘时把方块的位置重新计算了。

那么按下上方向键时,如何让方块翻转呢?

我们在配置文件中就把方块的顺时针翻转形态放在了一起:

@###

@###

@@##

####

@@@#

@###

####

####

@@##

#@##

#@##

####

##@#

@@@#

####

####

我们每按一次上方向键改变一次方块的形状即可。若一直按上键,形状应该是循环地翻滚。

我们想到了循环链表的数据结构可实现这个效果。

可是我们若把这些一种类的方块的各种形态串成循环链表形式,那么每次重新生成方块时我们就难以随机地生成方块了。

故还是得用数组来存储,但又要有循环链表的功能,于是我们想到了静态循环链表。

我们用结构体来作为一个方块在rockArray中的元素

typedef struct ROCK

{  //用来表示方块的形状(每一个字节是8位,用每4位表示方块中的一行)

unsigned int rockShapeBits ;

int          nextRockIndex ;  //下一个方块,在数组中的下标

} RockType ;

这样,当我们按下上方向键时,把传入函数DrawRock中的rockIndex变为当前方块结构体中的nextRockIndex即可。

参考资料:

C语言图形界面篇

"扫雷"小游戏C代码

#include<stdioh>

#include<mathh>

#include<timeh>

#include<stdlibh>

main( )

{char a[102][102],b[102][102],c[102][102],w;

int i,j;  /循环变量/

int x,y,z[999];  /雷的位置/

int t,s;  /标记/

int m,n,lei;  /计数/

int u,v;  /输入/

int hang,lie,ge,mo;  /自定义变量/

srand((int)time(NULL));  /启动随机数发生器/

leb1:  /选择模式/

printf("\n   请选择模式:\n   1标准  2自定义\n");

scanf("%d",&mo);

if(mo==2)  /若选择自定义模式,要输入三个参数/

{do

{t=0; printf("请输入\n行数 列数 雷的个数\n");

scanf("%d%d%d",&hang,&lie,&ge);

if(hang<2){printf("行数太少\n"); t=1;}

if(hang>100){printf("行数太多\n");t=1;}

if(lie<2){printf("列数太少\n");t=1;}

if(lie>100){printf("列数太多\n");t=1;}

if(ge<1){printf("至少要有一个雷\n");t=1;}

if(ge>=(hanglie)){printf("雷太多了\n");t=1;}

}while(t==1);

}

else{hang=10,lie=10,ge=10;}  /否则就是选择了标准模式(默认参数)/

for(i=1;i<=ge;i=i+1)  /确定雷的位置/

{do

{t=0; z[i]=rand( )%(hanglie);

for(j=1;j<i;j=j+1){if(z[i]==z[j]) t=1;}

}while(t==1);

}

for(i=0;i<=hang+1;i=i+1)  /初始化a,b,c/

{for(j=0;j<=lie+1;j=j+1) {a[i][j]='1'; b[i][j]='1'; c[i][j]='0';} }

for(i=1;i<=hang;i=i+1)

{for(j=1;j<=lie;j=j+1) {a[i][j]='+';} }

for(i=1;i<=ge;i=i+1)  /把雷放入c/

{x=z[i]/lie+1; y=z[i]%lie+1; c[x][y]='#';}

for(i=1;i<=hang;i=i+1)  /计算b中数字/

{for(j=1;j<=lie;j=j+1)

{m=48;

if(c[i-1][j-1]=='#')m=m+1; if(c[i][j-1]=='#')m=m+1;

if(c[i-1][j]=='#')m=m+1;  if(c[i+1][j+1]=='#')m=m+1;

if(c[i][j+1]=='#')m=m+1;  if(c[i+1][j]=='#')m=m+1;

if(c[i+1][j-1]=='#')m=m+1; if(c[i-1][j+1]=='#')m=m+1;

b[i][j]=m;

}

}

for(i=1;i<=ge;i=i+1)  /把雷放入b中/

{x=z[i]/lie+1; y=z[i]%lie+1; b[x][y]='#';}

lei=ge;  /以下是游戏设计/

do

{leb2:  /输出/

system("cls");printf("\n\n\n\n");

printf("    ");

for(i=1;i<=lie;i=i+1)

{w=(i-1)/10+48; printf("%c",w);

w=(i-1)%10+48; printf("%c  ",w);

}

printf("\n   |");

for(i=1;i<=lie;i=i+1){printf("---|");}

printf("\n");

for(i=1;i<=hang;i=i+1)

{w=(i-1)/10+48; printf("%c",w);

w=(i-1)%10+48; printf("%c |",w);

for(j=1;j<=lie;j=j+1)

{if(a[i][j]=='0')printf("   |");

else printf(" %c |",a[i][j]);

}

if(i==2)printf(" 剩余雷个数");

if(i==3)printf(" %d",lei);

printf("\n   |");

for(j=1;j<=lie;j=j+1){printf("---|");}

printf("\n");

}

scanf("%d%c%d",&u,&w,&v);  /输入/

u=u+1,v=v+1;

if(w!='#'&&a[u][v]=='@')

goto leb2;

if(w=='#')

{if(a[u][v]=='+'){a[u][v]='@'; lei=lei-1;}

else if(a[u][v]=='@'){a[u][v]=''; lei=lei+1;}

else if(a[u][v]==''){a[u][v]='+';}

goto leb2;

}

a[u][v]=b[u][v];

leb3:  /打开0区/

t=0;

if(a[u][v]=='0')

{for(i=1;i<=hang;i=i+1)

{for(j=1;j<=lie;j=j+1)

{s=0;

if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;

if(a[i-1][j]=='0')s=1;  if(a[i+1][j-1]=='0')s=1;

if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;

if(a[i][j-1]=='0')s=1;  if(a[i][j+1]=='0')s=1;

if(s==1)a[i][j]=b[i][j];

}

}

for(i=1;i<=hang;i=i+1)

{for(j=lie;j>=1;j=j-1)

{s=0;

if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;

if(a[i-1][j]=='0')s=1;  if(a[i+1][j-1]=='0')s=1;

if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;

if(a[i][j-1]=='0')s=1;   if(a[i][j+1]=='0')s=1;

if(s==1)a[i][j]=b[i][j];

}

}

for(i=hang;i>=1;i=i-1)

{for(j=1;j<=lie;j=j+1)

{s=0;

if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;

if(a[i-1][j]=='0')s=1;  if(a[i+1][j-1]=='0')s=1;

if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;

if(a[i][j-1]=='0')s=1;  if(a[i][j+1]=='0')s=1;

if(s==1)a[i][j]=b[i][j];

}

}

for(i=hang;i>=1;i=i-1)

{for(j=lie;j>=1;j=j-1)

{s=0;

if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;

if(a[i-1][j]=='0')s=1;  if(a[i+1][j-1]=='0')s=1;

if(a[i+1][j+1]=='0')s=1;if(a[i+1][j]=='0')s=1;

if(a[i][j-1]=='0')s=1;  if(a[i][j+1]=='0')s=1;

if(s==1)a[i][j]=b[i][j];

}

}

for(i=1;i<=hang;i=i+1)  /检测0区/

{for(j=1;j<=lie;j=j+1)

{if(a[i][j]=='0')

{if(a[i-1][j-1]=='+'||a[i-1][j-1]=='@'||a[i-1][j-1]=='')t=1;

if(a[i-1][j+1]=='+'||a[i-1][j+1]=='@'||a[i-1][j+1]=='')t=1;

if(a[i+1][j-1]=='+'||a[i+1][j-1]=='@'||a[i+1][j-1]=='')t=1;

if(a[i+1][j+1]=='+'||a[i+1][j+1]=='@'||a[i+1][j+1]=='')t=1;

if(a[i+1][j]=='+'||a[i+1][j]=='@'||a[i+1][j]=='')t=1;

if(a[i][j+1]=='+'||a[i][j+1]=='@'||a[i][j+1]=='')t=1;

if(a[i][j-1]=='+'||a[i][j-1]=='@'||a[i][j-1]=='')t=1;

if(a[i-1][j]=='+'||a[i-1][j]=='@'||a[i-1][j]=='')t=1;

}

}

}

if(t==1)goto leb3;

}

n=0;  /检查结束/

for(i=1;i<=hang;i=i+1)

{for(j=1;j<=lie;j=j+1)

{if(a[i][j]!='+'&&a[i][j]!='@'&&a[i][j]!='')n=n+1;}

}

}

while(a[u][v]!='#'&&n!=(hanglie-ge));

for(i=1;i<=ge;i=i+1)  /游戏结束/

{x=z[i]/lie+1; y=z[i]%lie+1; a[x][y]='#'; }

printf("    ");

for(i=1;i<=lie;i=i+1)

{w=(i-1)/10+48; printf("%c",w);

w=(i-1)%10+48; printf("%c  ",w);

}

printf("\n   |");

for(i=1;i<=lie;i=i+1){printf("---|");}

printf("\n");

for(i=1;i<=hang;i=i+1)

{w=(i-1)/10+48; printf("%c",w);

w=(i-1)%10+48; printf("%c |",w);

for(j=1;j<=lie;j=j+1)

{if(a[i][j]=='0')printf(" |");

else  printf(" %c |",a[i][j]);

}

if(i==2)printf(" 剩余雷个数");

if(i==3)printf(" %d",lei); printf("\n   |");

for(j=1;j<=lie;j=j+1) {printf("---|");}

printf("\n");

}

if(n==(hanglie-ge)) printf("你成功了!\n");

else printf("    游戏结束!\n");

printf("    重玩请输入1\n");

t=0;

scanf("%d",&t);

if(t==1)goto leb1;

}

/注:在DEV c++上运行通过。行号和列号都从0开始,比如要确定第0行第9列不是“雷”,就在0和9中间加入一个字母,可以输入0a9三个字符再按回车键。3行7列不是雷,则输入3a7回车;第8行第5列是雷,就输入8#5回车,9行0列是雷则输入9#0并回车/

我实训是做了这个项目,发给你看看,功能主要和交通灯的差不多,还可以显示具体的时间,跳转的时候,时间是倒计时的,当到0以后,下面灯转换

#include<reg51h>

unsigned int shi,ge,js;

void delay(unsigned char i);

sbit P2_0=P2^0;

sbit P2_1=P2^1;

unsigned int i=0;

unsigned char key_press();

unsigned char key_scan();

unsigned int m=0;m2=0;n1=6;n2=2;

void TIMERO_1();

void TIMERO_0();

unsigned char led[4]={0xee,0xdb,0xf5,0xdb};

unsigned char code tabe[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x00};

unsigned char num;

unsigned char key_scan()

{ unsigned char hang,lie,key;

P3=0x0f;

if(P3!=0x0f)

delay(100);

if(P3!=0x0f)

{

switch(P3&0x0f)

{

case 0x0e:hang=0;break;

case 0x0d:hang=1;break;

case 0x0b:hang=2;break;

//case 0x07:hang=3;break;

}

P3=0xf0;

switch(P3&0xf0)

{

case 0xe0:lie=0;break;

case 0xd0:lie=1;break;

case 0xb0:lie=2;break;

case 0x70:lie=3;break;

}

while(P3!=0xf0);

key=hang4+lie;

}

// else

// key=12;

return (key);

}

unsigned char key_press()

{

unsigned char temp,key_flag;

P3=0x0f;

delay(100);

temp=P3;

if (temp!=0x0f)

{

key_flag=1;

}

else

{

key_flag=0;

}

return key_flag;

}

void TIMERO_0() interrupt 1

{

TH0=0X3C;

TL0=0XB0;

m++;

if(m==20)

{

m=0;

n1--;

shi=n1/10;

ge=n1%10;

}

if(n1==0)

{i=i+1;

n2=3;

TR1=1;

TR0=0;

}

//if(ge==0)

//{ge=2;}

}

void TIMERO_1() interrupt 3

{

TH1=0X3C;

TL1=0XB0;

m2++;

if(m2==20)

{

m2=0;

n2--;

shi=n2/10;

ge=n2%10;

}

if(n2==0)

{

i=i+1;

n1=js;

TR0=1;

TR1=0;

if(i== 4)

{

i=0;

}

//if(ge==0)

//{ge=js;}

}

}

void display(unsigned char a,b,c,d,e,f)

{

P2_1=1;

P2_0=0;

P0=0x20;

P2_0=1;

P2_1=0;

P0=tabe[a];

delay(10);

P0=0x00;

P2_1=1;

P2_0=0;

P0=0X10;

P2_0=1;

P2_1=0;

P0=tabe[b];

delay(10);

P0=0x00;

P2_1=1;

P2_0=0;

P0=0x08;

P2_0=1;

P2_1=0;

P0=tabe[c];

delay(10);

P0=0x00;

P2_1=1;

P2_0=0;

P0=0x04;

P2_0=1;

P2_1=0;

P0=tabe[d];

delay(10);

P0=0x00;

P2_1=1;

P2_0=0;

P0=0x02;

P2_0=1;

P2_1=0;

P0=tabe[e];

delay(10);

P0=0x00;

P2_1=1;

P2_0=0;

P0=0x01;

P2_0=1;

P2_1=0;

P0=tabe[f];

delay(10);

P0=0x00;

delay(10);

}

void main()

{

TMOD=0X11;

TH0=0X3C;

TL0=0XB0;

TH1=0X3C;

TL1=0XB0;

ET1=1;

ET0=1;

EA=1;

P1=0XFF;

while(1)

{

P0=0;

if(key_press())

{ num=key_scan();

if(num<=9)

{

shi=ge;

ge=num;

js=shi10+ge;

n1=js;

}

if(num==10)

{

TR0=0;

TR1=0;

shi=ge;

ge=num;

}

if(num==11)

{

TR0=1;

i=0;

js=shi10+ge;

}

}

P1=led[i];

display(12,12,12,12,shi,ge);

}

}

void delay(unsigned char i )

{

unsigned char j, k;

for(k=0;k<i;k++);

for(j=0;j<255;j++);

}

这里我们用了一个 Python的正则模块 refindall来做字符串匹配解决这个问题

看下正则的流程

首先说下什么是正则表达式, 正则其实就是对字符串特征的抽象!!!

当我们的字符串特性变化了,我们不需要大幅度修改程序,只要修改该特征结构就可以重新匹配我们要的字符

这里我们用到了以下几种类型 正则表达式 

字符

边界

特殊构造

回到题目  我们需要做的是将"("和")"之间的字符串匹配出来

 <=[(]            代表 "(" 开始,但不一定是串首

 =[)]               代表 ")" 结束,但不一定是串尾

[^()]+\[^()]+  代表 中间含 ""的字符串, "\"是""转义字符  "+"代表里面可以有1个""或无数个""

最后代码片断:

import re

refindall("(<=[(])[^()]+\[^()]+(=[)])",text)

分类: 电脑/网络 >> 互联网

问题描述:

打开IE浏览器后,网页未打开就出现蓝屏,提示硬件或软件出现错误。错误日志显示挂起程序错误icwconnlexe,版本6028001166,挂起模块hungapp,版本0000,挂起地址0×。急求解决方法!

解析:

你有装杀毒软件和防火墙么

有些杀毒软件和防火墙会冲突

尤其是卡巴,和很多防火墙一起用都会造成蓝屏

你好:

void L1602_char(uchar hang,uchar lie,char sign) 这段函数就不解释了,很简单的,在指定地址写一个数据进去。

void L1602_string(uchar hang,uchar lie,uchar p)

{

uchar a,b=0; //声明两个变量,a作行地址,b作行数据最大数据个数 16

if(hang == 1) a = 0x80; //如果行为1,写命令0x80

if(hang == 2) a = 0xc0; //如果是第二行,则写命令0xc0

a = a + lie - 1; //0x80、0xc0是没行第一个地址,再根据列来具体到某个位置。

//为什么要减1,因为传递参数进去时,第一个位置是写1,但是 //1602每行第一行第一个位置是0。所以减1

while(1)

{

wcmd(a++); //写地址,然后把a自增一次

b++; //对数据个数计数

if((p == '\0')||(b==16)) break; //如果遇到字符串尾或者数据个数为16了,跳出

wdata(p); //写数据,因为是指针,所以欠扁有取值运算符,

p++; //吧指针加1,准备取下一个数据

}

}

希望我的回答能帮助到你。

以上就是关于液晶12864的显示程序全部的内容,包括:液晶12864的显示程序、用汇编语言在键盘输入一个字符串,并将其从左向右滚动显示,求完整程序、用c语言编写俄罗斯方块程序 求详解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10079321.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存