📄 zhkcsj.c
字号:
#include"at89x52.h"
#include<intrins.h>
#include<stdio.h>
#include<zi.h>
#define uchar unsigned char
#define uint unsigned int
#define disp_off 0x3e
#define disp_on 0x3f
#define disp_x 0xb8
#define disp_z 0xc0
#define disp_y 0x40
#define comm 0
#define dat 1
#define data_ora P0
sbit LED_CLK=P1^0; //LED时钟线
sbit LED_DAT=P1^1; //LED数据线
sbit di =P3^7; //Data or Instrument Select,H:写数据,L:写指令
sbit rw =P3^6; //Write or Read,H:read,L:write
sbit e =P1^2; //读写使能
sbit cs1=P1^4; //cs1=H,选择左半屏
sbit cs2=P1^3; //cs2=H,选择右半屏
sbit rst=P1^5; //Lcm reset,低有效
sbit data0=P2^0;
sbit data1=P2^1;
sbit data2=P2^2;
sbit data3=P2^3;
sbit mode0=P2^4;
sbit mode1=P2^5;
sbit start=P2^6;
void init_lcd(void);
void disps(void);
void disp_f(void);
void disp_m(void);
void disp_e(void);
void disp_pl(void);
void disp_ms(void);
void wr_lcd (uchar dat_comm,uchar content);
void lat_disp (uchar data1,uchar data2);
void chn_disp (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,uchar code *chn);
void led_display(uchar i);
const uchar code LED_FONT[11]={ //
0xFC, //0
0x60, //1
0xDA, //2
0xF2, //3
0x66, //4
0xB6, //5
0xBE, //6
0xE0, //7
0xFE, //8
0xF6, //9
0x00, //不显示
};
uchar set_freq;
uchar set_mode;
uint freq;
uchar mode;
uchar buchang;
void delayl (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++)
;
}
set0()interrupt 0
{
uchar i;
delayl(10);
if(set_freq==1){
if((P2&0x0f)==0x00){led_display(0);freq=freq*10;}
if((P2&0x0f)==0x01){led_display(1);freq=freq*10+1;}
if((P2&0x0f)==0x02){led_display(2);freq=freq*10+2;}
if((P2&0x0f)==0x03){led_display(3);freq=freq*10+3;}
if((P2&0x0f)==0x04){led_display(4);freq=freq*10+4;}
if((P2&0x0f)==0x05){led_display(5);freq=freq*10+5;}
if((P2&0x0f)==0x06){led_display(6);freq=freq*10+6;}
if((P2&0x0f)==0x07){led_display(7);freq=freq*10+7;}
if((P2&0x0f)==0x08){led_display(8);freq=freq*10+8;}
if((P2&0x0f)==0x09){led_display(9);freq=freq*10+9;}
}
if(set_mode==1){
if((P2&0x0f)==0x00){led_display(0);mode=0;}
if((P2&0x0f)==0x01){led_display(1);mode=1;}
if((P2&0x0f)==0x02){led_display(2);mode=2;}
// mode=(P2&0x0f); ?????????????
}
if((P2&0x0f)==0x0a)
{
freq=0;
for(i=0;i<6;i++)led_display(0);
set_freq=1;set_mode=0;
}
if((P2&0x0f)==0x0b)
{
mode=0;
for(i=0;i<6;i++)led_display(0);
set_mode=1;set_freq=0;
}
if((P2&0x0f)==0x0c)
{
buchang=freq/8;
P0=freq/8;
if((mode&0x01)==0)mode0=0;
else {mode0=1;}
if((mode&0x02)==0)mode1=0;
else {mode1=1;}
start=1;
delayl(55);
start=0;
set_freq=0;
set_mode=0;
}
}
main() /*主程式*/
{
EA=1; /*CPU开中断*/
IT0=1; /*外部中断1下降沿触发方式*/
EX0=1; /*外部中断1的中断允许位置1*/
freq=8;
mode=0;
start=0;
led_display(0);
led_display(0);
led_display(0);
led_display(0);
led_display(0);
led_display(8);
init_lcd();
lat_disp(0x00,0x00);
disps();
P0=freq/8;
mode0=0;
mode1=0;
start=1;
delayl(5);
start=0;
while(1){
if(set_freq==1)disp_f();
if(set_mode==1)disp_m();
if((set_freq==0)&&(set_mode==0)){disp_e();disp_pl();disp_ms();}
delayl(4);
}
}
/*------------写数据或命令到LCD--------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
//chk_busy ();
di=dat_comm;
rw=0;
data_ora=content;
e=1;
;
e=0;
}
/*------------------初始化-----------------*/
void init_lcd (void)
{
rst=0;
delayl(5);
rst=1;
cs1=1;cs2=1;
wr_lcd (comm,disp_off);
wr_lcd (comm,disp_on);
}
/*---指定位置(x,y)显示row_xl行(每行row_yl个)汉字(大小8xl*yl)---*/
void chn_disp (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,uchar code *chn)
{
uchar i,j,k,l,a;
wr_lcd (comm,disp_on);
for(l=0;l<row_xl;l++)
{
for(k=0;k<row_yl;k++)
{
for(j=0;j<xl;j++)
{
wr_lcd (comm,disp_x+x+l*xl+j);
wr_lcd (comm,disp_z);
wr_lcd (comm,disp_y+y+k*yl);
a=l*xl*yl*row_yl+k*xl*yl+j*yl;
for(i=0;i<yl;i++)
wr_lcd (dat,chn[a+i]);
}
}
}
}
/*--------------写点阵------------------*/
void lat_disp (uchar data1,uchar data2)
{
uchar i,j;
cs1=1;cs2=1;
wr_lcd (comm,disp_on);
for(j=0;j<8;j++)
{
wr_lcd (comm,disp_x+j);
wr_lcd (comm,disp_z);
wr_lcd (comm,disp_y);
for(i=0;i<32;i++)
{
wr_lcd (dat,data1);
wr_lcd (dat,data2);
}
}
}
void disps()
{
lat_disp(0x00,0x00);
cs1=0;cs2=1;
chn_disp(0,2,2,8,1,3,kaishia);
chn_disp(0,31,2,16,1,2,kaishib);
}
void disp_f()
{
cs1=0;cs2=1;
chn_disp(2,0,2,16,1,4,szpl);
chn_disp(4,0,2,16,1,2,pl);
}
void disp_m()
{
cs1=0;cs2=1;
chn_disp(2,0,2,16,1,4,szms);
chn_disp(6,0,2,16,1,2,ms);
}
void disp_e()
{
cs1=0;cs2=1;
chn_disp(2,0,2,16,1,4,wcsz);
}
void disp_pl()
{
uchar i;
uchar j=0;
uint midpinlv;
cs1=1;cs2=0;
midpinlv=freq;
for(i=0;i<6;i++)
{
j=midpinlv%10;
midpinlv=midpinlv/10;
chn_disp(4,40-8*i,2,8,1,1,shuzi+j*16);
}
}
void disp_ms()
{
if(mode==0)chn_disp(6,0,2,16,1,3,sin);
if(mode==1)chn_disp(6,0,2,16,1,2,pulse);
if(mode==2)chn_disp(6,0,2,16,1,3,angle);
}
void led_display(uchar i)
{
uchar j,mask;
mask=0x01;
for(j=0;j<8;j++){
LED_CLK=0;
LED_DAT=( (LED_FONT[i]) & mask);
mask<<=1;
LED_CLK=1; //上升沿移位
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -