📄 lab.c
字号:
#include <p18f452.h>
#define unchar unsigned char
#define wr1622_Wr PORTDbits.RD1 //WR
#define wr1622_Dt PORTDbits.RD0 //DATA
#define wr1622_Cs PORTCbits.RC4
unsigned char SC3[10];//={0X46,0X55,0X01,0X00,0X00,0X16,0X00,0X08,0X7E,0};
unsigned char fs_bz,setp,cls_bz,xf_bz;//负数标志,,按钮次数,关屏标志,显示符号标志
rom unsigned char SC1[]={
0x70,0xd0,0x60,0x00,0x30,0xe0,0x70,0xa0,//0,1,2,3
0x60,0x30,0x50,0xb0,0x50,0xf0,0x70,0x00,//4,5,6,7
0x70,0xf0,0x70,0xb0,0x00,0x00,0x00,0x20};//8,9.NOP,-
rom unsigned char SC2[]={
0xf0,0xd0,0xe0,0x00,0xb0,0xe0,0xf0,0xa0,//0.,1.,2.,3.
0xe0,0x30,0xd0,0xb0,0xd0,0xf0,0xf0,0x00,//4.,5.,6.,7.
0xf0,0xf0,0xf0,0xb0,0x20,0x80,0xc0,0x00};//8.,9.s5,Kvar.h
#pragma config OSC = HS, OSCS = OFF
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config WDT = OFF
#pragma config CCP2MUX = OFF
#pragma config LVP = OFF
void add_dm(void);//全显段码
void cls_dms(void);//清除数码
void cls_dm(void);//段码清屏
void wr1622_Initial(void);// 初始化段码屏
void wr1622_gb(void);//关屏
void mesg_out2(unsigned char m,unsigned char add,rom unsigned char *b);
void DelayMs(unsigned char i); //延时i 毫秒
void DelayUs(unsigned char i); //延时3*i 微秒
void WcommandID(unsigned char b);//3
void Wmadd(unsigned char b);//7
void Writecommand(unsigned char b);//8
void Writedata(unsigned char b);//4
void wr_b(unsigned char add,unsigned char data);//显示任意字符
void main()
{
wr1622_Initial();//初始化段码屏
cls_dms();//清除数码
cls_dm();//段码清屏
//add_dm();//全显段码
while(1)
{
wr_b(14,14);
}
}
void wr_b(unsigned char add,unsigned char data)
{// add-0-36;data-2-16;
unsigned char kk,jj;
wr1622_Cs=1;
wr1622_Cs=0;
wr1622_Wr=0;
wr1622_Dt=1;
wr1622_Wr=1;//1
wr1622_Wr=0;
wr1622_Dt=0;
wr1622_Wr=1;//0
wr1622_Wr=0;
wr1622_Dt=1;
wr1622_Wr=1;//1 //101
wr1622_Wr=0;
wr1622_Cs=0;
for(kk=0;kk<6;kk++)
{
wr1622_Wr=0;
if((add&0x20)==0x20)
wr1622_Dt=1;
else
wr1622_Dt=0;
wr1622_Wr=1;
wr1622_Dt=0;
add<<=1;
}
for(jj=0;jj<5;jj++)
{
wr1622_Wr=0;
if((data&0x01)==0x01)
wr1622_Dt=1;
else
wr1622_Dt=0;
wr1622_Wr=1;
wr1622_Dt=0;
data>>=1;
}
wr1622_Wr=0;
}
void Writedata(unsigned char b)//4
{
unsigned char ii;
wr1622_Wr=0;
for(ii=0;ii<4;ii++)
{
if((b&0x01)==0x01)wr1622_Dt=1;
else wr1622_Dt=0;
_asm
NOP
NOP
NOP
_endasm
wr1622_Wr=1;
_asm
NOP
NOP
NOP
_endasm
wr1622_Wr=0;
b>>=1;
}
}
void WcommandID(unsigned char b)
//b=0x80时,进入命令模式。b=0xa0时,进入写或读修改写模式。
{
unsigned char ii;
wr1622_Wr=0;
for(ii=0;ii<3;ii++)
{
if((b&0x80)==0x80)wr1622_Dt=1;
else wr1622_Dt=0;
_asm
NOP
NOP
NOP
_endasm
wr1622_Wr=1;
_asm
NOP
NOP
NOP
_endasm
wr1622_Wr=0;
b<<=1;
}
}
void Wmadd(unsigned char b)
{
unsigned char ii;
b<<=2;
wr1622_Wr=0;
for(ii=0;ii<6;ii++)
{
if((b&0x80)==0x80)wr1622_Dt=1;
else wr1622_Dt=0;
_asm
NOP
NOP
NOP
_endasm
wr1622_Wr=1;
_asm
NOP
NOP
NOP
_endasm
wr1622_Wr=0;
b<<=1;
}
}
void Writecommand(unsigned char b)
{
unsigned char ii;
wr1622_Wr=0;
for(ii=0;ii<8;ii++)
{
if((b&0x80)==0x80)wr1622_Dt=1;
else wr1622_Dt=0;
_asm
NOP
NOP
NOP
_endasm
wr1622_Wr=1;
_asm
NOP
NOP
NOP
_endasm
wr1622_Wr=0;
b<<=1;
}
}
void wr1622_gb(void)
{
wr1622_Cs=0;
WcommandID(0x80);
Writecommand(2);//关屏
wr1622_Cs=1;
}
void wr1622_Initial(void) // 初始化段码屏
{
TRISDbits.TRISD0=0;
TRISDbits.TRISD1=0;
TRISCbits.TRISC4=0;
wr1622_Cs=1;
_asm
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
_endasm
wr1622_Cs=0;
WcommandID(0x80);
Writecommand(1);//Turn on system osciallator//开屏频率
Writecommand(3);//Turn on LCD display开屏
Writecommand(0x29);//1/4 duty,1/3 bias
// Writecommand(0x18);//on chip rc oscillator
wr1622_Cs=1;
wr1622_Wr=1;
}
void cls_dm(void)//段码清屏
{unsigned char i;
for(i=0;i<96;i++)
mesg_out2(2,i,SC1+20);
}
void cls_dms(void)//清除数码
{unsigned char i;
mesg_out2(2,15,SC1+20);
mesg_out2(2,28,SC1+20);
//mesg_out2(2,26,SC1+20);
for(i=0;i<37;i++)
{ mesg_out2(1,i,SC1+20);
if(i==3)i=30;
}
}
void add_dm(void)//全显段码
{unsigned char i;
for(i=0;i<96;i++)
mesg_out2(2,i,SC2+16);
}
void mesg_out2(unsigned char m,unsigned char add,rom unsigned char *b)
{
unsigned char k,i,j;
wr1622_Cs=1;
_asm
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
_endasm
wr1622_Cs=0;
_asm
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
_endasm
WcommandID(0xa0);
Wmadd(add);
_asm
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
_endasm
wr1622_Wr=1;
for(i=0;i<m;i++)
{k=*(b+i);
for(j=0;j<8;j++)
{
wr1622_Wr=0;
_asm
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
_endasm
if((k&0x80)==0x80)wr1622_Dt=1;
else wr1622_Dt=0;
wr1622_Wr=1;
_asm
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
_endasm
k<<=1;
}
}
wr1622_Cs=1;
wr1622_Wr=1;
}
void DelayUs(unsigned char i) //延时3*i 微秒
{
while(i--);
}
void DelayMs(unsigned char i) //延时i 毫秒
{
while(i--)
DelayUs(150);
DelayUs(150);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -