📄 the effect of implementation on wheels rolled from right to left .txt
字号:
12864液晶趣味显示:实现汽车轮子从右滚到左的效果
DDS中波形查找表的产生
#include "c8051f020.h"
#include <intrins.h>
#define LCD_DATA P7
#define LCD_RS P10
#define LCD_RW P11
#define LCD_E P12
#define LCD_CS1 P13
#define LCD_CS2 P14
#define LCD_RST P15
#define SELECTCS 0
void SYSCLK_Init (void); //初始化时钟
void Timer0_Init (void); //初始化定时器
void PORT_Init (void); //初始化IO口
void TestLCD(void);
void main (void)
{
WDTCN = 0xde;
WDTCN = 0xad; //关看门狗
SYSCLK_Init (); //初始化时钟
Timer0_Init(); //初始化定时器
PORT_Init (); //初始化IO口
EA=1; //开中断
TestLCD();
}
void SYSCLK_Init (void)
{
int i; // delay counter
OSCXCN = 0x65; // start external oscillator with
// 18.432MHz crystal
for (i=0; i < 256; i++) ; // Wait for osc. to start up
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
// source and enable missing clock
// detector
// OSCICN = 0x07; // interal 16MHZ
}
void PORT_Init (void)
{
// XBR0 = 0x07; // Enable SMBus, SPI0, and UART0
// XBR1 = 0x00;
XBR2 = 0x44; // Enable crossbar and weak pull-ups
P74OUT = 0x00;
}
unsigned char Count1ms;
void Timer0_Init (void)
{
CKCON =0x8;
TMOD =0x1; //16Bit
Count1ms=10;
TR0 = 0; // STOP Timer0
TH0 = (-SYSCLK/1000) >> 8; // set Timer0 to overflow in 1ms
TL0 = -SYSCLK/1000;
TR0 = 1; // START Timer0
IE = 0x2;
}
void Timer0_ISR (void) interrupt 1 //1ms
{
TH0 = (-SYSCLK/1000) >> 8;
TL0 = -SYSCLK/1000;
if (Count1ms) Count1ms--;
}
void Delay1us(unsigned char us)
{
while (us)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
--us;
}
}
void Delay1ms(unsigned char T)
{
Count1ms=T;
while (Count1ms);
}
void Delay1s(unsigned char T)
{
while (T)
{
Delay1ms(200);
Delay1ms(200);
Delay1ms(200);
Delay1ms(200);
Delay1ms(200);
T--;
}
}
void LCD_WaitReady1(void) //判断LCD控制芯片KS0108是否忙
{
LCD_DATA=0xff;
_nop_();
LCD_CS2=SELECTCS;
LCD_RW=1;
LCD_RS=0;
LCD_E=1;
while (LCD_DATA&0x80);
LCD_CS2=!SELECTCS;
}
void LCD_WaitReady2(void) //判断LCD控制芯片KS0108是否忙
{
LCD_DATA=0xff;
_nop_();
LCD_CS1=SELECTCS;
LCD_RW=1;
LCD_RS=0;
LCD_E=1;
while (LCD_DATA&0x80);
LCD_CS1=!SELECTCS;
}
void LCD_WriteCommand1(char ch) //向LCD控制芯片KS0108发送控制命令
{
LCD_WaitReady1();
LCD_CS2=SELECTCS;
LCD_RW=0;
LCD_RS=0;
LCD_DATA=ch;
LCD_E=1;
LCD_E=0;
LCD_CS2=!SELECTCS;
}
void LCD_WriteCommand2(char ch) //向LCD控制芯片KS0108发送控制命令
{
LCD_WaitReady2();
LCD_CS1=SELECTCS;
LCD_RW=0;
LCD_RS=0;
LCD_DATA=ch;
LCD_E=1;
LCD_E=0;
LCD_CS1=!SELECTCS;
}
void LCD_WriteData1(char ch) //向LCD控制芯片KS0108发送数据命令
{
LCD_WaitReady1();
LCD_CS2=SELECTCS;
LCD_RW=0;
LCD_RS=1;
LCD_DATA=ch;
LCD_E=1;
LCD_E=0;
LCD_CS2=!SELECTCS;
}
void LCD_WriteData2(char ch) //向LCD控制芯片KS0108发送数据命令
{
LCD_WaitReady2();
LCD_CS1=SELECTCS;
LCD_RW=0;
LCD_RS=1;
LCD_DATA=ch;
LCD_E=1;
LCD_E=0;
LCD_CS1=!SELECTCS;
}
void InitLCD(void) //初始化LCD
{
char i,j;
LCD_RST=0;
Delay1ms(5);
LCD_RST=1;
Delay1ms(1);
LCD_WriteCommand1(0xc0); //显示起始行
LCD_WriteCommand2(0xc0); //显示起始行
LCD_WriteCommand1(0x3f); //开显示
LCD_WriteCommand2(0x3f); //开显示
for (j=0;j<8;j++) //清屏
{
LCD_WriteCommand1(0xB8+j); //页(Y)地址,清左半屏
LCD_WriteCommand1(0x40); //(X)地址
for (i=0;i<64;i++)
LCD_WriteData1(0x00);
LCD_WriteCommand2(0xB8+j); //清右半屏
LCD_WriteCommand2(0x40);
for (i=0;i<64;i++)
LCD_WriteData2(0x00);
}
}
void ClearLCD(void)
{
char i,j;
for (j=0;j<8;j++) //清屏
{
LCD_WriteCommand1(0xB8+j); //页(Y)地址,清左半屏
LCD_WriteCommand1(0x40); //(X)地址
for (i=0;i<64;i++)
LCD_WriteData1(0x00);
LCD_WriteCommand2(0xB8+j); //清右半屏
LCD_WriteCommand2(0x40);
for (i=0;i<64;i++)
LCD_WriteData2(0x00);
}
}
void LCD_WriteHZ(char x,char y,char *Dot) //显示16*16点阵汉字
{
char i;
for (i=0;i<32;i++)
{
if ((x+i%16)<64)
{
LCD_WriteCommand1(0xB8+y+i/16);
LCD_WriteCommand1(0x40+x+i%16);
LCD_WriteData1(Dot[i]);
}
else
{
LCD_WriteCommand2(0xB8+y+i/16);
LCD_WriteCommand2(0x40+x-64+i%16);
LCD_WriteData2(Dot[i]);
}
}
}
void DispBmp1(char x,char *buf) //显示一幅位图
{
int i,j;
for (j=0;j<8;j++) //显示位图
{
LCD_WriteCommand1(0xB8+j);
LCD_WriteCommand1(0x40+x);
for (i=0;i<64-x;i++)
LCD_WriteData1(buf[(j*2)*64+i]);
LCD_WriteCommand1(0xB8+j);
LCD_WriteCommand1(0x40);
for (i=64-x;i<64;i++)
LCD_WriteData1(buf[(j*2+1)*64+i]);
LCD_WriteCommand2(0xB8+j);
LCD_WriteCommand2(0x40+x);
for (i=0;i<64-x;i++)
LCD_WriteData2(buf[(j*2+1)*64+i]);
LCD_WriteCommand2(0xB8+j);
LCD_WriteCommand2(0x40);
for (i=64-x;i<64;i++)
LCD_WriteData2(buf[(j*2)*64+i]);
}
}
void DispBmp2(char x,char *buf) //显示一幅位图
{
int i,j;
for (j=0;j<8;j++) //显示位图
{
LCD_WriteCommand1(0xB8+j);
LCD_WriteCommand1(0x40+63-x);
for (i=0;i<=x;i++)
LCD_WriteData1(buf[(j*2+1)*64+i]);
LCD_WriteCommand1(0xB8+j);
LCD_WriteCommand1(0x40);
for (i=x+1;i<64;i++)
LCD_WriteData1(buf[(j*2)*64+i]);
LCD_WriteCommand2(0xB8+j);
LCD_WriteCommand2(0x40+63-x);
for (i=0;i<=x;i++)
LCD_WriteData2(buf[(j*2)*64+i]);
LCD_WriteCommand2(0xB8+j);
LCD_WriteCommand2(0x40);
for (i=x+1;i<64;i++)
LCD_WriteData2(buf[(j*2+1)*64+i]);
}
}
//char code screen[];
char code screen1[];
char code screen2[];
char code screen3[];
char code screen4[];
char code screen5[];
char code screen6[];
char code screen7[];
char code screen8[];
char code Han[];
char code Zi[];
void TestLCD(void)
{
char i;
InitLCD();
for (;;)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -