📄 driver_s1.c
字号:
/*
* Copyright 2005,重庆市海德自动化有限公司开发室
* All rights reserved.
*
*
* 文件名称: DRIVER_S1.c
*
* 摘 要: OJMC4*8C显示器件的串行驱动程序,新华龙IDE调试,主控芯片C8051F330.
* 显示汉字,显示字符。
*
*
* 当前版本: 1.0
* 作 者: 余小勇
* 开始日期: 2005年7月18日
* 完成日期: 2005年7月19日
*
*
* 其它说明: 1.时序正常
2.能清全屏
3.能显示汉字和字符
4.串行通信模式,可显示8*4共32个16点阵汉字
5.直接向80H-9FH的DDRAM写入相应内码
*/
//-----------------------------------------------------------------------------
//头文件包含
//-----------------------------------------------------------------------------
#include <c8051f330.h>
#include <intrins.h>
//-----------------------------------------------------------------------------
// 位定义
//-----------------------------------------------------------------------------
unsigned char bdata TEMP; //RW,RS暂存位寻址寄器定义
sbit CS=P0^2; //4脚CS
sbit STD=P0^0; //5脚R/W
sbit SCLK=P0^1; //6脚E
sbit RW=TEMP^0; //RW暂存位
sbit RS=TEMP^1; //RS暂存位
//-----------------------------------------------------------------------------
// 定义函数
//-----------------------------------------------------------------------------
void SYSCLK_Init (void); //主芯片初始化
void LCD_Init (void); //LCD初始化
void CLR_Screen (void); //LCD清屏
void SEND_Byte (unsigned char LCD_Byte); // 发送一个字节
void DELAY(unsigned int count); //延时COUNT*1US
void DISPLAY(unsigned char h,unsigned char l,unsigned char LCD_data_H,unsigned char LCD_data_L); //在h行,l列的位置显示指定汉字字符,行(0-3),列(0-7)
//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------
void main(){
SYSCLK_Init(); //主芯片初始化
DELAY(65000);
LCD_Init(); // LCD初始化
while(1){
DISPLAY(0,1,0xd6,0xd8); //内码“重”
DELAY(50);
DISPLAY(0,2,0xc7,0xec); //内码“庆”
DELAY(50);
DISPLAY(0,3,0xba,0xa3); //内码“海”
DELAY(50);
DISPLAY(0,4,0xb5,0xc2); //内码“德”
DELAY(50);
DISPLAY(0,5,0xb9,0xab); //内码“公”
DELAY(50);
DISPLAY(0,6,0xcb,0xbe); //内码“司”
DELAY(50);
DISPLAY(1,0,0x31,0x32);
DELAY(50);
DISPLAY(1,1,0x33,0x34);
DELAY(50);
DISPLAY(1,2,0x35,0x36);
DELAY(50);
DISPLAY(1,3,0x37,0x38);
DELAY(50);
DISPLAY(1,4,0x39,0x40);
DELAY(50);
DISPLAY(1,5,0x41,0x42);
DELAY(50);
DISPLAY(1,6,0x43,0x44);
DELAY(50);
DISPLAY(1,7,0x45,0x46);
DELAY(50);
DISPLAY(2,0,0x47,0x48);
DELAY(50);
DISPLAY(2,1,0x4a,0x4b);
DELAY(50);
DISPLAY(2,2,0x4c,0x4d);
DELAY(50);
DISPLAY(2,3,0x4e,0x4f);
DELAY(50);
DISPLAY(2,4,0x50,0x51);
DELAY(50);
DISPLAY(2,5,0x52,0x53);
DELAY(50);
DISPLAY(2,6,0x54,0x55);
DELAY(50);
DISPLAY(2,7,0x56,0x57);
DELAY(50);
DISPLAY(3,0,0x58,0x59);
DELAY(50);
DISPLAY(3,1,0x5a,0x5b);
DELAY(50);
DISPLAY(3,2,0x5c,0x5d);
DELAY(50);
DISPLAY(3,3,0x5e,0x5f);
DELAY(50);
DISPLAY(3,4,0x60,0x61);
DELAY(50);
DISPLAY(3,5,0x62,0x63);
DELAY(50);
DISPLAY(3,6,0x64,0x65);
DELAY(50);
DISPLAY(3,7,0x66,0x67);
DELAY(50);
DELAY(65000);
DELAY(65000);
DELAY(65000);
CLR_Screen();
DELAY(50);
DISPLAY(1,1,0xba,0xa3); //内码“海”
DELAY(50);
DISPLAY(1,2,0xb5,0xc2); //内码“德”
DELAY(50);
DISPLAY(1,3,0xd7,0xd4); //内码“自”
DELAY(50);
DISPLAY(1,4,0xb6,0xaf); //内码“动”
DELAY(50);
DISPLAY(1,5,0xbb,0xaf); //内码“化”
DELAY(50);
DISPLAY(2,2,0xbf,0xaa); //内码“开”
DELAY(50);
DISPLAY(2,3,0xb7,0xa2); //内码“发”
DELAY(50);
DISPLAY(2,4,0xca,0xd2); //内码“室”
DELAY(65000);
DELAY(65000);
DELAY(65000);
CLR_Screen();
}
}
//-----------------------------------------------------------------------------
// 主芯片初始化
//-----------------------------------------------------------------------------
void SYSCLK_Init (void) //主芯片初始化
{
EA=0; //禁止中断
XBR1=0x40; //允许交叉开关
OSCICN=0xc0; //内部高频振荡的8分频FOSC/8=24.5/8=3.0625Mhz FSYSCLK
PCA0MD=0x00; //禁止看门狗定时器
P0=0x00;
P1=0x00;
}
//-----------------------------------------------------------------------------
// 在h行,l列的位置显示指定汉字或字符,行(0-3),列(0-7)
//-----------------------------------------------------------------------------
void DISPLAY(unsigned char h,unsigned char l,unsigned char LCD_data_H,unsigned char LCD_data_L){
unsigned char code adress[4][8]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f};
_nop_();_nop_();_nop_();
RS=0; //设定DDRAM地址(80H-9FH)1 AC6 AC5 AC4 AC3 AC2 AC1 AC0
RW=0;
_nop_();_nop_();_nop_();
SEND_Byte (adress[h][l]);
_nop_();_nop_();_nop_();
DELAY(100); //延时80us
_nop_();_nop_(); // 写显示数据到RAM,每个RAM地址都要连续写入两个字节的数据
RW=0;
_nop_();_nop_();
RS=1;
_nop_();_nop_();
SEND_Byte (LCD_data_H); //发送显示数据高字节
_nop_();_nop_();
DELAY(100); //延时100us
RW=0;
_nop_();_nop_();
RS=1;
_nop_();_nop_();
SEND_Byte (LCD_data_L); //发送显示数据低字节
_nop_();_nop_();
DELAY(100); //延时100us
}
//-----------------------------------------------------------------------------
// LCD初始化
//-----------------------------------------------------------------------------
void LCD_Init (void){
CLR_Screen(); // LCD清屏
_nop_();_nop_();_nop_();
RS=0;
RW=0;
_nop_();_nop_();_nop_();
SEND_Byte (0x06); //光标右移,AC自动加一,整体显示不移动
_nop_();_nop_();_nop_();
DELAY(100); //延时80us
_nop_();_nop_();_nop_();
RS=0;
RW=0;
_nop_();_nop_();_nop_();
SEND_Byte (0x0c); //整体显示ON,光标显示OFF,光标位置不反白闪烁
_nop_();_nop_();_nop_();
DELAY(100); //延时100us
_nop_();_nop_();_nop_();
RS=0;
RW=0;
_nop_();_nop_();_nop_();
SEND_Byte (0x30); //8-BIT 控制接口,基本指令集动作
_nop_();_nop_();_nop_();
DELAY(100); //延时100us
_nop_();_nop_();_nop_();
}
//-----------------------------------------------------------------------------
// LCD清屏
//-----------------------------------------------------------------------------
void CLR_Screen (void){
RW=0;
_nop_();_nop_();
RS=0;
_nop_();_nop_();_nop_();
SEND_Byte (0x01); //发送清屏指令
_nop_();_nop_();_nop_();
DELAY(2000);
_nop_();_nop_();_nop_();
}
//-----------------------------------------------------------------------------
// 发送一个字节
//-----------------------------------------------------------------------------
void SEND_Byte (unsigned char LCD_Byte){
unsigned char i;
CS=1;
_nop_();_nop_();_nop_();_nop_();
STD=1;
_nop_();_nop_();
for (i=0;i<5;i++){ //发送同步位字符串
SCLK=0;
_nop_();_nop_();
SCLK=1;
_nop_();_nop_();
}
STD=RW; //发送RW
SCLK=0;
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
STD=RS; //发送RS
SCLK=0;
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
STD=0; //发送一个0
SCLK=0;
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
i=4; //发送数据高四位
while(i--){
STD=(bit)(LCD_Byte&0x80);
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
LCD_Byte<<=1;
SCLK=0;
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
}
STD=0; //发送4个0
i=4;
for (i=0;i<4;i++){
SCLK=0;
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
}
_nop_();
_nop_();
i=4; //发送数据低四位
while(i--){
STD=(bit)(LCD_Byte&0x80);
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
LCD_Byte<<=1;
_nop_();_nop_();
SCLK=0;
_nop_();_nop_();
SCLK=1;
_nop_();_nop_();
}
STD=0; // 发送4个0
i=4;
for (i=0;i<4;i++){
SCLK=0;
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
}
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
CS=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
//-----------------------------------------------------------------------------
// 延时COUNT*1us
//-----------------------------------------------------------------------------
void DELAY(unsigned int count) //延时COUNT*1us
{
unsigned int k,p;
for(k=0; k<count; k++){
for (p=0; p<=4; p++){
_nop_();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -