📄 main.c
字号:
/********************************************************************
Create on : 2005.6
Last modifed on : 2006 ver 1.0
by : Baisz(Sichuan University)
*********************************************************************/
#include "sfr62a.h"
#include "math.h"
#include "code.h"
void runaway();
void mcu_init(); /* 单片机初始化子程序 */
void lcd_init(); /* LCD初始化子程序 */
void Touchscreen_init();//触摸屏初始化子程序
//void display();
void clear_screen(); /* 清显示RAM 区(清屏)函数 */
void delay();
void delay1();
void Picture_0();
void Picture_1();
void Picture_2();
void Picture_3();
void Picture_4();
void Picture_5();
void Picture_6();
void Picture_7();
void pr11(unsigned char com_dat); /* 参数指令写入入口 */
void pr12(unsigned char com_dat);
pr13(unsigned char com_dat);
void box();
void box1();
void W_DOT1(int o_x,int o_y);
void W_DOT(int o_x,int o_y);
//void show();
//void CW_PR(char o_x,char o_y);
//void W_DOT(int o_x,int o_y);
void CCW_PR(unsigned char o_x, unsigned char o_y);
void CCW_PR1(unsigned char o_x,unsigned char o_y);
void CCW_PR2(unsigned char o_x,unsigned char o_y);
void CCW_PR3(unsigned char o_x,unsigned char o_y);
void CCW_PR4(unsigned char o_x,unsigned char o_y);
void CCW_PR5(unsigned char o_x,unsigned char o_y);
void WR_Zero(unsigned char a_x,unsigned char a_y);
void WR_One(unsigned char a_x,unsigned char a_y);
void WR_Two(unsigned char a_x,unsigned char a_y);
void WR_Three(unsigned char a_x,unsigned char a_y);
void WR_Four(unsigned char a_x,unsigned char a_y);
void WR_Five(unsigned char a_x,unsigned char a_y);
void WR_Six(unsigned char a_x,unsigned char a_y);
void WR_Seven(unsigned char a_x,unsigned char a_y);
void WR_Eight(unsigned char a_x,unsigned char a_y);
void WR_Nine(unsigned char a_x,unsigned char a_y);
void WR_Ge(unsigned char a_x,unsigned char a_y);
void WR_Xiang(unsigned char a_x,unsigned char a_y);
void WR_Dian(unsigned char a_x,unsigned char a_y);
void WR_Can(unsigned char a_x,unsigned char a_y);
void WR_Shu(unsigned char a_x,unsigned char a_y);
void WR_Liu(unsigned char a_x,unsigned char a_y);
void WR_Ya(unsigned char a_x,unsigned char a_y);
void WR_LETT_K(unsigned char a_x,unsigned char a_y);
void WR_LETT_W(unsigned char a_x,unsigned char a_y);
void WR_LETT_U(unsigned char a_x,unsigned char a_y);
void WR_LETT_P(unsigned char a_x,unsigned char a_y);
void WR_LETT_F(unsigned char a_x,unsigned char a_y);
void WR_LETT_I(unsigned char a_x,unsigned char a_y);
void WR_LETT_H(unsigned char a_x,unsigned char a_y);
void WR_LETT_H1(unsigned char a_x,unsigned char a_y);
void WR_LETT_T(unsigned char a_x,unsigned char a_y);
void WR_LETT_D(unsigned char a_x,unsigned char a_y);
void WR_LETT_A(unsigned char a_x,unsigned char a_y);
void WR_LETT_B(unsigned char a_x,unsigned char a_y);
void WR_LETT_C(unsigned char a_x,unsigned char a_y);
void WR_LETT_V(unsigned char a_x,unsigned char a_y);
void WR_LETT_a(unsigned char a_x,unsigned char a_y);
void WR_LETT_b(unsigned char a_x,unsigned char a_y);
void WR_LETT_c(unsigned char a_x,unsigned char a_y);
void WR_LETT_z(unsigned char a_x,unsigned char a_y);
void WR_LETT_m(unsigned char a_x,unsigned char a_y);
void WR_LETT_s(unsigned char a_x,unsigned char a_y);
void WR_LETT_d(unsigned char a_x,unsigned char a_y);
void WR_LETT_i(unsigned char a_x,unsigned char a_y);
void WR_LETT_v(unsigned char a_x,unsigned char a_y);
void WR_LETT_R(unsigned char a_x,unsigned char a_y);
void WR_LETT_M(unsigned char a_x,unsigned char a_y);
void WR_LETT_S(unsigned char a_x,unsigned char a_y);
void WR_Pic(unsigned char a_x,unsigned char a_y);
void WR_Pic1(unsigned char a_x,unsigned char a_y);
void WR_ABC(unsigned char a_x,unsigned char a_y);
void WR_ABC1(unsigned char a_x,unsigned char a_y);
void WR_ABC2(unsigned char a_x,unsigned char a_y);
void WR_ABC3(unsigned char a_x,unsigned char a_y);
void WR_ABC4(unsigned char a_x,unsigned char a_y);
ReadFromCharFrom7843();
void WriteCharTo7843(unsigned char num);
void Disp_num(unsigned char a_x,unsigned char a_y,unsigned int loc_num);
/* 写参数代码 */
unsigned char systab[8] = {0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00};
unsigned char scrtab[10] = {0x00,0x00,0xF0,0x00,0x40,0xF0,0x00,0x80,0x00,0x00};
void main()
{
unsigned int i,j;
unsigned int X=0,Y=0;
mcu_init();
lcd_init();
Touchscreen_init(); //启动SPI
delay();
WriteCharTo7843(0x90); //送控制字 10010000 即用差分方式读X坐标 详细请见有关资料
delay();
p5_3=1;
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
p5_3=0;
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
X=ReadFromCharFrom7843(); //读X轴坐标
WriteCharTo7843(0xd0); //送控制字 11010000 即用差分方式读Y坐标 详细请见有关资料
delay();
p5_3=1;
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
p5_3=0;
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
Y=ReadFromCharFrom7843(); //读Y轴坐标
//delay1(1000);
asm(" nop ");
asm(" nop ");
asm(" nop ");
p0_6=1;
clear_screen();
Disp_num(0x03,0x08,X%10);
Disp_num(0x02,0x08,(X/10)%10);
Disp_num(0x01,0x08,(X/100)%10);
Disp_num(0x07,0x08,Y%10);
Disp_num(0x06,0x08,(Y/10)%10);
Disp_num(0x05,0x08,(Y/100)%10);
/* Picture_0();
clear_screen();
Picture_1();
for(i=0;i<70;i++)
delay();
clear_screen();
Picture_2();
for(i=0;i<70;i++)
delay();
clear_screen();
Picture_3();
for(i=0;i<70;i++)
delay();
clear_screen();
Picture_4();
for(i=0;i<70;i++)
delay();
clear_screen();
Picture_5();
for(i=0;i<70;i++)
delay();
clear_screen();
Picture_6();
for(i=0;i<70;i++)
delay();
clear_screen();
Picture_7(); */
while(1){};
}
// watch dog中断处理函数runaway
#pragma INTERRUPT /B runaway
void runaway(void)
{
asm(" bset 1,03f1h");
asm(" mov.b #07h,0ah");
asm(" bset 3,04h");
asm("mov.b #00h,0ah");
}
void Touchscreen_init()
{
}
/********************************************************************
初始化所有的寄存器和i/o口,和timer,a-d
*********************************************************************/
void mcu_init()
{
p0=0x00;
pd0=0xff; //p0_7为蜂鸣器输出,其他不使用,均设为输出口
p1=0x00;
pd1=0x1f; //p1_5~p1_7口设为输入,p1_0~p1_4控制对LCD的读写设为输出
pu03=1; //p1_4~p1_7上拉
p2=0x00;
pd2=0xff; //p2为数据口,设为输出
p3=0x00;
pd3=0xff; //p3不使用,设为输出
p4=0x00;
pd4=0xff; //不使用,设为输出
p5=0x00;
pd5=0xff;
p6=0x00;
pd6=0x00; //p6为仿真口输入
p7=0x00;
pd7=0xff; //p7不使用,设为输出
p8=0x00;
pd8=0xc3; //p8_0和p8_1为输出(控制继电器),p8_2~p8_4为输入,p8_5必须设为输入
asm(" mov.b #04h,0ah"); //重写pd9之前需对保护寄存器0ah的位2置1
pd9=0xff; //p9不使用,设为输出
p9=0x00;
p10=0x00;
pd10=0x00; //p10为AD输入
cm04=1; //启动辅时钟(定时器计数时钟源); 系统时钟控制寄存器
//cm04:Xc口选择位 0:I/O口 1:Xcin-Xcout驱动
//初始化Timer
ta3mr=0x00; //时钟频率为f1=11.0592MHz,无gate功能,no pulse输出,时钟mode
ta3=0x04b0; //周期为100us(when f1=12MHz)
ta3ic=6; //中断优先级,最低为0最高为7,为0时中断禁止
ta3mr=0xc0; //时钟频率为fc32=1.024kHz,无gate功能,no pulse输出,时钟mode
ta3=0x1388; //周期为5s
ta3ic = 6;
ta2mr=0xc0; //时钟频率为fc32=1.024kHz,无gate功能,no pulse输出,时钟mode
ta2=0x1388; //周期为5s
ta2ic=0; //禁止中断
ta1mr=0xc0; //时钟频率为fc32=1.024kHz,无gate功能,no pulse输出,时钟mode
ta1=0xf000; //周期为60s
ta1ic=6; //中断优先级为6
tb2mr=0x00; //时钟频率为f1=11.0592MHz,无gate功能,no pulse输出,时钟mode
tb2=0x229; //周期为0.05ms
tb2ic=0; //中断优先级,最低为0最高为7,为0时中断禁止
ta0mr=0x01; //事件计数模式
udf=0x01; //加计数
onsf=0x40; //TB2的溢出为计数源
ta0=0x159f; //从5535开始加计数,至65535时溢出,每周期3000ms
ta0ic=6;
//初始化AD
adcon0=0x90; //时钟为fAD/2,软件触发,单次扫描模式
adcon1=0x23; //8位模式,扫描通道位AN0~AN7
adcon2=0x01; //有采样保持
//初始化INT4
ifsr4=0; //单向边沿触发
ifsr6=1; //中断起因为INT4
int4ic=0x07; //下降沿触发,中断优先级为7
ir_int4ic=0; //清除中断请求位
s1ric=6; /* 接收中断 */
u1mr=0x05; /* 8bit data, internal clock,1 stop bit, 无奇偶校验,sleep mode deselected */
u1c0=0x18; /* cts/rts disabled, f1 selected, 无数据在发送寄存器(发送完成后)时"空"标志置1 */
u1irs=1; /* 发送结束后(发送寄存器空)产生中断 */
u1brg=5; /* 比特率生成器,波特率115200(11.0592M晶振) */
u1brg=71;
// 初始化watchdog
wdc7=1; //预分频比为128,12MHz时钟下溢出周期约为350ms
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
}
void delay()
{
for(count1=0;count1<60000;count1++)
{
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
}
}
/********************************/
/* 初始化函数lcd_init */
/* 内部调用函数:pr1(),pr12() */
/* 函数调用入口:lcd_init() */
/* 函数参数:para */
/* 函数调用变量:无 */
/********************************/
void lcd_init()
{
unsigned int j;
//设置SYSTEM SET代码
pr11( 0x40);
for (j=0;j<8;j++)
{
pr12(systab[j]);
}
//设置SCROLL代码
pr11(0x44);
for (j=0;j<10;j++)
{
pr12( scrtab[j]);
}
//设置HDOT SCR代码
pr11(0x5A);
pr12(0x00);
//设置OVLAY代码
pr11(0x5B);
pr12(0x0c);
pr11(0x5d);
pr12(0x07);
pr12(0x88);
clear_screen(); //清显示RAM子程序
pr11(0x59);
pr12(0x54);
}
/************************************/
/* 清显示RAM 区(清屏)函数clear_screen */
/* 内部调用函数:pr1(),pr12(),st3() */
/* 函数输入变量:无 */
/* 函数调用入口:clear_screen() */
/************************************/
void clear_screen()
{
unsigned int i,j;
//设置CSRDIR代码,无参数
pr11(0x4C);
//设置CSRW代码
pr11(0x46);
pr12(0x00);
pr12(0x00);
//设置MWRITE代码
pr11(0x42);
for(i=0;i<2195;i++)
{
for(j=0;j<30;j++)
{
pr12(0x00);
}
}
}
/************************************/
/* 写指令代码子程序 */
/* 函数输入变量:dat1,dat2,com */
/************************************/
void pr11(unsigned char com_dat) /* 写指令代码 */
{
int i;
p1_2 = 0; //选通片选
// pd2 = 0xff;
p1_3 = 1; /*置写命令状态*/
for(i=0;i<10;i++);
p0_4 = 1; /*关掉读信号*/
p1_0 = 0; /*开写信号*/
for(i=0;i<10;i++);
p2 = com_dat; /*输出命令字*/
for(i=0;i<21;i++);
p1_0 = 1; /*关掉写信号*/
//pd2 = 0x00;
p1_2 = 1; /*关片选*/
}
void pr12(unsigned char com_dat) /* 写参数代码 */
{
int i;
p1_2 = 0; /*选通片选*/
//pd2 = 0xff;
p1_3 = 0; /*置写命令状态*/
for(i=0;i<10;i++);
p0_4 = 1;//关读信号
p1_0 = 0; /*开写信号*/
for(i=0;i<10;i++);
p2 = com_dat; /*输出命令字*/
for(i=0;i<21;i++);
p1_0 = 1; /*关掉写信号*/
//pd2=0x00;
p1_2 = 1; /*关片选*/
}
pr13(unsigned char com_dat) /* 读参数代码 */
{
int i;
pd2 =0x00;
pur0=0x30;
asm(" nop ");
asm(" nop ");
p1_2 = 0; /*选通片选*/
p1_3 = 1; /*置读命令状态*/
for(i=0;i<10;i++);
p1_0 = 1; /*关写信号*/
p0_4 = 0; //开读信号
for(i=0;i<15;i++);
com_dat = p2; /*输出命令字*/
for(i=0;i<21;i++);
p0_4 = 1; /*关掉写信号*/
p1_2 = 1; /*关片选*/
asm(" nop ");
asm(" nop ");
pd2 = 0xff;
pur0=0x00;
return(com_dat);
}
void WriteCharTo7843(unsigned char num) //SPI写数据
{
unsigned char i;
p5_3=0;
for(i=128;i>0;)
{
if(num&i)
{
p6_3 = 1;
}
else
{
p6_3 = 0;
}
i=i/2;
p5_3=0;
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop "); //上升沿有效
p5_3=1;
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
}
}
ReadFromCharFrom7843() //SPI 读数据
{
unsigned char i;
unsigned int Num=0;
for(i=0;i<12;i++)
{
Num =Num*2;
p5_3=1;
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
p5_3=0;
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
if(p6_2) Num++;
}
return(Num);
}
void Picture_0()
{
WR_Pic1(0x05,0x08);
WR_ABC2(0x0a,0xbe);
for(count1=0;count1<15;count1++)
delay();
WR_ABC2(0x0d,0xbe);
for(count1=0;count1<15;count1++)
delay();
WR_ABC2(0x10,0xbe);
for(count1=0;count1<15;count1++)
delay();
WR_ABC2(0x13,0xbe);
for(count1=0;count1<15;count1++)
delay();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -