📄 xqdz.c
字号:
/*头文件*/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define NOP() _nop_()
/*端口定义*/
sbit EN_port = P1^3;
sbit DA_in_port = P1^2;
sbit CLK_port = P1^1;
sbit Latch_port = P1^0;
#define ABCD_port P1 //HC138 ABCD端口定义
//sbit D_port = P1^7;
//sbit C_port = P1^6;
//sbit B_port = P1^5;
//sbit A_port = P1^4;
uchar code ziku_table[]={
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/*显示8行空白*/
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xF3,0xFC,0xF3,0xCC,0x83,0xC4,0x83,0xF0,0xF3,0xFC,0x93,0x9C,0x83,0x80,0xE3,0xC1,
0x7F,0xFE,0x7F,0xFE,0x00,0x80,0x00,0x80,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0xFF,0xFF,/*"毕",0*/
0x9F,0xFC,0x9F,0xFC,0x9F,0xFC,0x9F,0xFC,0x99,0xCC,0x99,0xCC,0x99,0xCC,0x93,0xE4,
0x93,0xE4,0x93,0xE4,0x9F,0xFC,0x9F,0xFC,0x9F,0xFC,0x00,0x80,0x00,0x80,0xFF,0xFF,/*"业",0*/
0x3B,0xF0,0x33,0xF0,0x27,0xF3,0x37,0xF3,0x1F,0x83,0x90,0x87,0x10,0xE0,0x13,0xE0,
0x33,0xE7,0x33,0xF3,0x73,0xF2,0xC3,0xF8,0x63,0xF0,0x13,0x86,0x9F,0xCF,0xFF,0xFF,/*"设",0*/
0xFF,0xFF,0xFB,0xF9,0xF3,0xF9,0xE7,0xF9,0xFF,0xF9,0x10,0x80,0x10,0x80,0xF3,0xF9,
0xF3,0xF9,0xF3,0xF9,0xF3,0xF9,0xD3,0xF9,0xC3,0xF9,0xE3,0xF9,0xF3,0xF9,0xFF,0xFF,/*"计",0*/
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/*显示8行空白*/
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
};
uchar data disp_buff[32]; //32 个显示数据缓存
//数据格式为 第1级第1行高八位,低八位,第1级第2行高八位。。。。。。
uchar data disp_han; //目前显示到第几行
void T0_Set() /*定义中断方式,中断时间*/
{
TMOD = 0x01; //定时0,工作在方式1
TH0 = (65536-1000)/256;
TL0 = (65536-1000)/256;
TR0 = 1; //启动计数
EA = 1; //开总中断
ET0 = 1; //开定时器0中断
return;
}
void delay_1ms(uchar x)
{
uchar j;
while(x--){
for(j=0;j<125;j++)
{;}
}
}
void main()
{
uchar i;
uint data_temp[2];
uint temp,temp1;
uchar hanzi;
uchar han;
uchar shift=1;
for(i=0;i<32;i++) disp_buff[i]=0xff;
T0_Set();
while(1){
for(hanzi=0;hanzi<4;hanzi++){ //最多显示多少个字
for(shift=0;shift<16;shift++){ //一个字移位16位
for(han=0;han<16;han++){ //一个字有16行数据
//取字库里面数据
data_temp[0]=ziku_table[(hanzi*32)+(han*2)+1]*0x100 + ziku_table[(hanzi*32)+(han*2)];
data_temp[1]=ziku_table[((hanzi+1)*32)+(han*2)+1]*0x100 + ziku_table[((hanzi+1)*32)+(han*2)];
//右往左移动
temp = data_temp[0];
temp1 = data_temp[1];
for(i=shift;i>0;i--){
temp = (temp>>1) ;
if((temp1&0x0001)!=0) temp = temp + 0x8000; //将TMEP1的最低位移位到TMEP的最高位
temp1 = (temp1>>1);
}
disp_buff[han*2+1]=temp/0x100;
disp_buff[han*2+0]=temp%0x100;
//------------------------------
}
delay_1ms(100); //移位速度
}
}
}
}
void SLED_Disp() interrupt 1 using 3
{
uchar i;
uchar data_buff;
uchar temp;
uchar han;
TH0 = (65536-1000)/256;
TL0 = (65536-1000)/256;
Latch_port = 0; //HC595锁定输出,避免数据传输过程中,屏数据变化从而显示闪烁
CLK_port = 0;
han=disp_han;
//74HC595输出数据
temp = disp_han*2+1;
data_buff = disp_buff[temp];
for(i=0;i<8;i++){
if((data_buff&0x80)!=0) DA_in_port = 1;
else DA_in_port = 0;
CLK_port = 1;
CLK_port = 0;
data_buff <<= 1;
}
temp = disp_han*2;
data_buff = disp_buff[temp];
for(i=0;i<8;i++){
if((data_buff&0x80)!=0) DA_in_port = 1;
else DA_in_port = 0;
CLK_port = 1;
CLK_port = 0;
data_buff <<= 1;
}
//74HC138输出控制
EN_port = 1; //关屏显示,原理为使HC138输出全为1,从而三极管截止,点阵不显示
ABCD_port = (ABCD_port & 0x0f)|(han<<4); //HC138译码输出
Latch_port = 1; //允许HC595数据输出到Q1-Q8端口
EN_port = 0; //HC138输出有效,打开显示
Latch_port = 0; //锁定HC595数据输出
disp_han++; //显示下一行数据
if(disp_han>=16) disp_han=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -