刚敲完,测试过,没有任何问题,放心使用
#include <reg51h>
#include <intrinsh>
#define uchar unsigned char
#define uint unsigned int
sbit K1=P2^4;
sbit K2=P2^3;
sbit K3=P2^2;
sbit K4=P2^1;
sbit K5=P2^0;
sbit BE=P2^7;
uchar code NUM[]=
{0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00,
0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00,
0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00,
0x00,0x22,0x49,0x49,0x49,0x26,0x00,0x00,
0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00,
0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00,
0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00,
0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00};
uint r;
char offset=0;
uchar Current_Level=1,Dest_Level=1,x=0,t=0;
void delay(uint x)
{
uchar i;
while(x--)
for(i=0;i<120;i++);
}
void main()
{
P3=0x80;
Current_Level=1;
Dest_Level=1;
TMOD=0x01;
TH0=-4000/256;
TL0=-4000%256;
TR0=1;
IE=0x82;
while(1);
}
void LED_Screen_Display() interrupt 1
{
uchar i;
if(P1!=0xff&&Current_Level==Dest_Level)
{
if(P1==0xfe) {Dest_Level=5;K5=0;}
if(P1==0xfd) {Dest_Level=4;K4=0;}
if(P1==0xfb) {Dest_Level=3;K3=0;}
if(P1==0xf7) {Dest_Level=2;K2=0;}
if(P1==0xef) {Dest_Level=1;K1=0;}
}
TH0=-4000/256;
TL0=-4000%256;
P3=_crol_(P3,1);
i=Current_Level8+r+offset;
P0=~NUM[i];
if(Current_Level<Dest_Level)
{
if(++r==8)
{
r=0;
if(++x==4)
{
x=0;
if(++offset==8)
{
offset=0;
Current_Level++;
}
}
}
}
else
if(Current_Level>Dest_Level)
{
if(++r==8)
{
r=0;
if(++x==4)
{
x=0;
if(--offset==-8)
{
offset=0;
Current_Level--;
}
}
}
}
else
{
if(++r==8) {r=0;}
}
}
以下是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
这要重新取汉字的字模了,原来的从左向右,是按列取模的,程序也是按列扫描的。
要改为向上向下,汉字要按行取模了,而且程序要按行扫描。
但有一点,就是你的点阵屏的硬件电路是怎么设计的,如果显示屏本身就是按列扫描驱动的,就改不了的。
单片机汉字点阵屏写暂停:读写时序,这个要小心,一般液晶控制芯片的时序分为8080,6800,根据规格书写出读写子程序,我们在写液晶程序时有时候没有显示,程序检查半天发现是读写子程序错误。
有闪烁,可能是时间太慢,扫描次数不够。每显示一个字,无论自上而下,还是从做到右,都是在利用欺骗眼睛的原理完成的。你一个字尽量多刷几次,每次的时间短一点,刷新频率高点(针对一个字)。两个字之间的间隔长一点。
地址寄存器AR:
地址寄存器用于保存当前CPU所要访问的内存单元或I/O设备的地址。由于内存与CPU之间存在着速度上的差异,所以必须使用地址寄存器来保持地址信息,直到内存读/写 *** 作完成为止。
显然,当CPU向存储器存数据、CPU从内存取数据和CPU从内存读出指令时,都要用到地址寄存器和数据寄存器。同样,如果把外围设备的地址作为内存地址单元来看的话,那么当CPU和外围设备交换信息时,也需要用到地址寄存器和数据寄存器。
首先调出一个8×8点阵,在点阵的管脚上接上VCC,另一端的管脚就接GND,运行仿真,看看点阵是不是能亮,亮了哪几个点,如果不亮就调换VCC和GND,这样测出点阵的行和列,共阴或共阳等引脚信息。
然后接上网络标识,行和行接同一个网络标志,列和列接在一起。多个8×8拼在一起就好了。
以上就是关于求一个c语言程序,用单片机,8*8点阵屏,和按键做一个电梯仿真系统……要求;按第一个键点阵屏显示1全部的内容,包括:求一个c语言程序,用单片机,8*8点阵屏,和按键做一个电梯仿真系统……要求;按第一个键点阵屏显示1、本人用74HC595驱动(行列)LED点阵16*16,由于编程能力有限,求高手指点,发我调试程序即可 带汉字显示哦、关于单片机程序,点阵屏文字移动方向怎么改变。我自己的程序的从左向右,哪位大神知道从上向下怎么改等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)