求助c51单片机的点阵实现程序!

求助c51单片机的点阵实现程序!,第1张

#include<reg51h>

#include<intrinsh>

#define uchar unsigned char

#define uint unsigned int

uchar code Table_of_Digits[]= //定义字符的点阵数据

{

0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, //0

0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00, //1

0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, //2

0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00, //3

0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00, //4

0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00, //5

0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, //6

0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00, //7

0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, //8

0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00, //9

0xff,0x81,0x81,0x81,0x81,0x81,0x81,0xff

};

uchar code xdat[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

uchar code ydat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

uchar i=0,j=0,t=0,Num_Index,key,xi,yi;

//主程序

void main()

{

P1=0x80;

Num_Index=0; //从0 开始显示

TMOD=0x01; //T0 方式0

TH0=(65536-2000)/256; //2ms 定时

TL0=(65536-2000)%256;

IE=0x82;

key=0;

xi=0;

yi=0;

EX0=1;

IT0=1;

TR0=1; //启动T0

while(1);

}

//T0 中断函数

void ext_int0() interrupt 0

{

key++;

key&=0x03;

}

void LED_Screen_Display() interrupt 1

{

TH0=(65536-2000)/256; //2ms 定时

TL0=(65536-2000)%256;

switch(key)

{

case 0:

P0=0xff; //输出位码和段码

P0=~Table_of_Digits[Num_Index8+i];

P1=_crol_(P1,1);

if(++i==8) i=0; //每屏一个数字由8 个字节构成

if(++t==250) //每个数字刷新显示一段时间

{

t=0;

if(++Num_Index==10) Num_Index=0; //显示下一个数字

}

break;

case 1:

P0=~xdat[xi];

P1=0xff;

P1=ydat[yi];

if(++t==250) //每个数字刷新显示一段时间

{

t=0;

yi++;

if(yi>7){yi=0;xi++;}

if(xi>7)xi=0;

}

break;

case 2:

P0=0xff; //输出位码和段码

P0=~Table_of_Digits[80+j];

if(j==0)P1=0x80;

P1=_crol_(P1,1);

if(++j==8) j=0; //每屏一个数字由8 个字节构成

break;

default:

key=0;

i=0;

j=0;

t=0;

xi=0;

yi=0;

Num_Index=0;

P0=0xff;

P1=0x80;

break;

}

}

//这里显示数字,字母的话,定义每个字母的代码就可以了,汉字够呛,1616点阵还可以,88不是很好。

#include<reg51h>

#include<intrinsh>

#define uchar unsigned char

#define uint unsigned int

uchar code Table_of_Digits[]=

{

0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, //0

0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00, //1

0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, //2

0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00, //3

0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00, //4

0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00, //5

0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, //6

0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00, //7

0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, //8

0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00, //9

0xff,0x81,0x81,0x81,0x81,0x81,0x81,0xff

};

uchar code xdat[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

uchar code ydat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

uchar i=0,j=0,t=0,Num_Index,key,xi,yi;

//主程序

void main()

{

P1=0x80;

Num_Index=0; //从0 开始显示

TMOD=0x01; //T0 方式0

TH0=(65536-2000)/256; //2ms 定时

TL0=(65536-2000)%256;

IE=0x82;

key=0;

xi=0;

yi=0;

EX0=1;

IT0=1;

TR0=1; //启动T0

while(1);

}

//T0 中断函数

void ext_int0() interrupt 0

{

key++;

key&=0x03;

}

void LED_Screen_Display() interrupt 1

{

TH0=(65536-2000)/256; //2ms 定时

TL0=(65536-2000)%256;

switch(key)

{

case 0:

P0=0xff; //输出位码和段码

P0=~Table_of_Digits[Num_Index8+i];

P1=_crol_(P1,1);

if(++i==8) i=0; //每屏一个数字由8 个字节构成

if(++t==250) //每个数字刷新显示一段时间

{

t=0;

if(++Num_Index==10) Num_Index=0; //显示下一个数字

}

break;

case 1:

P0=~xdat[xi];

P1=0xff;

P1=ydat[yi];

if(++t==250) //每个数字刷新显示一段时间

{

t=0;

yi++;

if(yi>7){yi=0;xi++;}

if(xi>7)xi=0;

}

break;

case 2:

P0=0xff; //输出位码和段码

P0=~Table_of_Digits[80+j];

if(j==0)P1=0x80;

P1=_crol_(P1,1);

if(++j==8) j=0; //每屏一个数字由8 个字节构成

break;

default:

key=0;

i=0;

j=0;#include<reg51h>

#include<intrinsh>

#define uchar unsigned char

#define uint unsigned int

uchar code Table_of_Digits[]=

{

0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, //0

0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00, //1

0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, //2

0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00, //3

0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00, //4

0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00, //5

0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, //6

0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00, //7

0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, //8

0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00, //9

0xff,0x81,0x81,0x81,0x81,0x81,0x81,0xff

};

uchar code xdat[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

uchar code ydat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

uchar i=0,j=0,t=0,Num_Index,key,xi,yi;

//主程序

void main()

{

P1=0x80;

Num_Index=0; //从0 开始显示

TMOD=0x01; //T0 方式0

TH0=(65536-2000)/256; //2ms 定时

TL0=(65536-2000)%256;

IE=0x82;

key=0;

xi=0;

yi=0;

EX0=1;

IT0=1;

TR0=1; //启动T0

while(1);

}

//T0 中断函数

void ext_int0() interrupt 0

{

key++;

key&=0x03;

}

void LED_Screen_Display() interrupt 1

{

TH0=(65536-2000)/256; //2ms 定时

TL0=(65536-2000)%256;

switch(key)

{

case 0:

P0=0xff; //输出位码和段码

P0=~Table_of_Digits[Num_Index8+i];

P1=_crol_(P1,1);

if(++i==8) i=0; //每屏一个数字由8 个字节构成

if(++t==250) //每个数字刷新显示一段时间

{

t=0;

if(++Num_Index==10) Num_Index=0; //显示下一个数字

}

break;

case 1:

P0=~xdat[xi];

P1=0xff;

P1=ydat[yi];

if(++t==250) //每个数字刷新显示一段时间

{

t=0;

yi++;

if(yi>7){yi=0;xi++;}

if(xi>7)xi=0;

}

break;

case 2:

P0=0xff; //输出位码和段码

P0=~Table_of_Digits[80+j];

if(j==0)P1=0x80;

P1=_crol_(P1,1);

if(++j==8) j=0; //每屏一个数字由8 个字节构成

break;

default:

key=0;

i=0;

j=0;

t=0;

xi=0;

yi=0;

Num_Index=0;

P0=0xff;

P1=0x80;

break;

}

}

t=0;

xi=0;

yi=0;

Num_Index=0;

P0=0xff;

P1=0x80;

break;

}

}

以下是16x16的点阵LED电子图文显示屏的源程序采用汇编语言编写(也可采用C语言编写,C程序KeiluVision2 V230环境下调试通过。

以下为用汇编语言编写的字符显示控制程序:

; 单个16x16的点阵电子屏字符显示器

; ATA89C52 12MHz晶振

; 2004211 LRM

;显示字用查表法,不占用内存,字符用16x16共阳LED点阵,

;效果:向上滚动显示5个字,再重复循环。

;R1:查表偏址寄存器,B:查表首址,R2:扫描地址(从00~0FH)。

;R3:滚动显示时控制移动速度,单字显示可控制静止显示的时间。

;;

;中断入口程序 ;

;;

ORG 0000H

LJMP START

ORG 0003H

RETI

ORG 000BH

LJMP INTTO

ORG 0013H

ERTI

ORG 001BH

ERTI

ORG 0023H

RETI

ORG 002BH

RETI

;;

;初始化程序;

;;

;;

; 主程序 ;

;;

START: MOV 20H,#00H ;清零标志,00H为第16行开始扫描标志,01为1帧

;扫描结束标志

MOV A,#0FFH ;端口初始化

MOV P1,A

MOV P1,A

MOV P3,A

MOV P0,A

CLR P16 ;串行寄存器输入打入输出控制位

MOV TMOD,#01H ;使用T0做16位定时器,行扫描用。

MOV TH0,#0FCH ;1ms初值(12MHz)

MOV TL0,#18H

MOV SCON,#00H ;串口0方式传送显示字节

MOV IE,#82H ;T0中断允许,总中断允许

MOV SP,#70H

MAIN: LCALL DISI ;显示准备,黑屏,15s

MOV DPTR,#TAB

LCALL MOVDISP ;向上滚动显示一页(8个字)

INC DPH

LCALL MOVDISP ;向上滚动显示一页(8个字)

INC DPH

LACLL MOVDISP ;向上滚动显示一页(8个字)

AJMP MAIN

;;

; 多字滚动显示程序 ;

;;

;每次8个字,入口时定义好DPTR值

MOVDISP: MOV B,#00H ;向上移动显示,查表偏值暂存(从00开始)

DISLOOP: MOV R3,#07H ;移动速度

DISMOV: MOV R2,00H ;第0行开始

MOV R1,B

SETB TR0 ;开扫描(每次一帧)

WAITMOV: JBC 01H,DISMOV1 ;标志为1扫描一帧结束(16ms为1帧,每行1ms)

AJMP WAITMOV

DISMOV1: DJNZ R3,DISMOV ;1帧重复显示(控制移动速度)

INC B ;显示字的下一行(每行2字节)

INC B

MOV A,R1 ;R1为0,8个字显示完

JZ MOVOUT

AJMP DISLOOP

MOVOUT: RET ;移动先是结束

;;

; 单字显示程序 ;

;;

;显示表中某个字;

;;

DIS1: MOV R3,#5AH ;静止显示时间控制(16ms#=16s)

DIS11: MOV R2,#00H ;一帧扫描初始值(行地址从00~0FH)

MOV DPTR,#TAB ;取表首址

MOV R1,#00H ;查表偏址(显示第一个字)

SETB TR0 ;开扫描(每次一帧)

WAIT11: JBC 01H,DIS111 ;为1,扫描一帧结束

AJMP WAIT11

DIS111: DJNZ R3,DIS11

RET

;;

; 扫描程序 ;

;;

;1ms刷新一次,每行显示1s

INTT0: PUSH ACC

MOV TH0,#0FCH ;1ms初值重装

MOV TL0,#18H

JBC 00H,GOEND ;16行扫描标志为1,结束

INC R1 ;取行右边字节偏址

MOV A,R1

MOVC A,@A+DPTR ;查表

MOV SBUF,A ;串口0方式发送

WAIT: JBC TI,GO ;等待发送完毕

AJMP WAIT1

GO: DEC R1 ;取行左边字节偏址

MOV A,R1

MOVC A,@A+DPTR

MOV SBUF,A

WAIT1: JBC T1,GO1

AJMP WAIT1

GO1: SETB P17 ;关行显示,准备刷新

NOP ;串口寄存器数据稳定

SETB P16 ;产生上升沿,行数据打入输出端

NOP

NOP

CLR P16 ;恢复低电平

MOV A,R2 ;修改显示行地址

ORL A,#0F0H ;修改显示行地址

MOV R2,A ;修改显示行地址

MOV A,P1 ;修改显示行地址

ORL A,#0FH ;修改显示行地址

ANL A,R2 ;修改显示行地址

MOV P1,A ;修改完成

CLR P17 ;开行显示

INC R2 ;下一行扫描地址值

INC R1

INC R1 ;下一行数据地址

MOV A,R2

ANL A,#0FH

JNZ GO2

SETB 00H ;R2为01H,现为末行扫描,置标志

GO2: POP ACC

RETI

GOEND: CLR TR0 ;一帧扫描完毕,关扫描

SETB 01H ;一帧扫描完毕,置结束标志

POP ACC

RETI ;退出

;;

; 扫描文字表 ;

;;

TAB:DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,00FFH,0FFH,0FFH ;黑屏

DB

0F9H,0BFH,0C7H,0AFH,0F7H,0B7H,0F7H,0B7H,0F7H,0BFH,000H,001H,0F7H,0BFH,0F7H,0B7H ;我

DB

0F1H,0D7H,0C7H,0CFH,037H,0DFH,0F7H,0AFH,0F6H,06DH,0F7H,0F5H,0D7H,0F9H,0EFH,0FDH ;

DB

0FFH,007H,0C0H,06FH,0EDH,0EFH,0F6H,0DFH,0C0H,001H,0DDH,0FDH,0BDH,0FFH,0C0H,003H ;爱

DB

0FBH,0FFH,0F8H,00FH,0F3H,0DFH,0F4H,0BFH,0EFH,03FH,09CH,0CFH,073H,0F1H,0CFH,0FBH ;

DB

0F7H,0DFH,0F9H,0CFH,0FBH,0BFH,0C0H,007H,0DEH,0F7H,0C0H,007H,0DEH,0F7H,0DEH,0F7H ;单

DB

0C0H,007H,0DEH,0F7H,0FEH,0FFH,000H,001H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH

DB

0FFH,0BFH,0EFH,0BFH,0EFH,0BFH,0EFH,0BBH,0E0H,001H,0EFH,0FFH,0EFH,0FFH,0EFH,0FFH ;片

DB

0E0H,00FH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0DFH,0EFH,0DFH,0EFH,0BFH,0EFH,07FH,0FFH

DB

0EFH,0FFH,0EFH,007H,0EFH,077H,001H,077H,0EFH,077H,0EFH,077H,0C7H,077H,0CBH,077H ;机

DB

0ABH,077H,0AFH,077H,06EH,0F7H,0EEH,0F5H,0EDH,0F5H,0EDH,0F5H,0EBH,0F9H,0EFH,0FFH ;

DB

0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH ;黑屏

DB

0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH ;

END

>

以上就是关于求助c51单片机的点阵实现程序!全部的内容,包括:求助c51单片机的点阵实现程序!、单片机8x 8点阵程序,hc6800——es v2.0,显示字母和汉字、本人用74HC595驱动(行列)LED点阵16*16,由于编程能力有限,求高手指点,发我调试程序即可 带汉字显示哦等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://www.54852.com/zz/10219676.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存