/////////////////////////////////////////////////////////////////////////////////////////////////////////
//FileName: JianKong.c
//Function: System control, I2c bus, display control
//Version: 1.0
//ModifyTime: 2005.3.10
//CopyRight: jtshi
/////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "reg51.h"
#include <intrins.h>
#include "shilongdianzi.h"
//constant define
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#define _Nop() _nop_() //NULL
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// X5045 related contant
/*#define WREN 0x06
#define WRDI 0x04
#define RSDR 0x05
#define WRSR 0x01
#define READ 0x03
#define WRITE 0x02
#define STATUS_REG 0x00
#define MAX_POLL 0x99*/
//Pin Define
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//Control line
sbit KEY_LINE_1 = P1^0; //Control line 1(1)
sbit KEY_LINE_2 = P1^1; //Control line 2(2)
sbit KEY_LINE_3 = P1^2; //Control line 3(3)
sbit KEY_LINE_4 = P1^3; //Control line 4(4)
sbit KEY_LINE_5 = P2^0; //Control line 5(21)
sbit KEY_LINE_6 = P2^1; //Control line 6(22)
//Display pin
sbit DISPLAY_CS = P2^4; //LCD Control Write Ctrl(25)
sbit DISPLAY_WR = P3^6; //LCD Control Write Ctrl(16)
sbit DISPLAY_RD = P3^7; //LCD Control Read Ctrl(17)
sbit DISPLAY_A0 = P2^7; //LCD Address 0(28)
sbit DISPLAY_A1 = P2^6; //LCD Address 1(27)
sbit DISPLAY_A2 = P2^5; //LCD Address 2(26)
sbit DISPLAY_D0 = P0^0; //LCD Data 0(39)
sbit DISPLAY_D1 = P0^1; //LCD Data 1(38)
sbit DISPLAY_D2 = P0^2; //LCD Data 2(37)
sbit DISPLAY_D3 = P0^3; //LCD Data 3(36)
sbit DISPLAY_D4 = P0^4; //LCD Data 4(35)
sbit DISPLAY_D5 = P0^5; //LCD Data 5(34)
sbit DISPLAY_D6 = P0^6; //LCD Data 6(33)
sbit DISPLAY_D7 = P0^7; //LCD Data 7(32)
//watch dog and EPROM
sbit WD_CS = P1^5; //Watch dog CS(6)
sbit WD_SO = P1^4; //Watch dog SO(5)
sbit WD_SCK = P1^7; //Watch dog SCK(8)
sbit WD_SI = P1^6; //Watch dog SI(7)
//I2C Bus
sbit SDA=P2^2; //I2C data
sbit SCL=P2^3; //I2C clk
//Other
//sbit C51_2P2 = P2^2; //Other 1(23)
//sbit C51_2P3 = P2^3; //Other 2(24)
sbit C51_3P2 = P3^2; //Other 3(12)
sbit C51_3P3 = P3^3; //Other 4(13)
sbit C51_3P4 = P3^4; //Other 5(14)
sbit C51_3P5 = P3^5; //Other 6(15)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//global variables
uchar fontMask[] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};//0x08/0x88
// 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12
uchar SAAreg[] = {0x00, 0x00, 0xc0, 0x33, 0x00, 0x00, 0xeb, 0xe0, 0x08, 0x01, 0x80, 0x47, 0x40, 0x00, 0x01, 0x00, 0x48, 0x0c, 0x00};
bit ack; //acknologe
//Function Declear
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//watch dog
/*void x5045_initial();
void x5045_rst_wdog();*/
//Display Ctrl
void InitLcd();
void ControlLcd(uchar clr, uchar xinc, uchar single);
void WriteAddrToLcd(uchar type, uchar dataA); //type: Xlow-0; Xhigh-1; Ylow-2; Yhigh-3
void WriteSingleDataToLcd(uchar type, uchar dataA, uchar iFb); //type: data-6; FrontColor-4; IFb: Word-1; Video and Word-0
void WriteMultiDataToLcd(uchar type, uchar dataA); //type: data-6;
void ClearScreen(); //Clear Screen
void SetPosXY(uint x, uint y); //Set position
void WriteMultiWord(uint x, uint y, uint xNum, uint yNum, uchar *pData); //write word at Screen
void Write3Digit(uint x, uint y, uchar num); //write word at Screen
//I2C bus
void Start_I2c();
void Stop_I2c();
void SendByte(uchar c);
uchar RcvByte();
void Ack_I2c(bit a);
bit ISendByte(uchar sla, uchar c);
bit IRcvByte(uchar sla, uchar *c);
//SAA7111A
void ConfigSAA7111A();
//定时器0
void InitTimer0() reentrant;
void Timer0ISR();
///////////////////////////////////////////////////////////////////////////////////////////////////////////
void main (void)
{
uchar flag = 0, switchInput = 0, swVideoWord = 0; //start position
uint t; //tmp
EA = 0; //disable all int
//Initial Lcd
InitLcd();
//Word and Video, Xinc, multiWrite
ControlLcd(0, 1, 1);
//write frontcolor(black)
WriteSingleDataToLcd(4, 0, 0);
//clear screen
ClearScreen();
//write frontcolor(blue)
WriteSingleDataToLcd(4, 0x03, 1);
//coord(x = 20, y = 30) : WL
WriteMultiWord(20, 30, 8, 48, shangbiaoWL);
//write frontcolor(red)
WriteSingleDataToLcd(4, 0xe0, 1);
//coord(x = 20, y = 30):circle
WriteMultiWord(20, 30, 8, 48, shangbiaohuan);
//write frontcolor(blue)
WriteSingleDataToLcd(4, 0x03, 1);
//coord(x = 20, y = 80):世
WriteMultiWord(20, 80, 2, 16, CodeShi);
//coord(x = 20, y = 36):龙
WriteMultiWord(36, 80, 2, 16, CodeLong);
//coord(x = 20, y = 52):电
WriteMultiWord(52, 80, 2, 16, CodeDian);
//coord(x = 20, y = 68):子
WriteMultiWord(68, 80, 2, 16, CodeZi);
//coord(x = 500, y = 30):亮度
WriteMultiWord(150, 200, 6, 16, CodeLiangDu);
Write3Digit(200, 200, SAAreg[10]);
//coord(x = 500, y = 50):对比度
WriteMultiWord(134, 220, 8, 16, CodeDuiBiDu);
Write3Digit(200, 220, SAAreg[11]);
////////////////////////////////////////////////////////////////////////////////
while(1) //Loop forever
{
//judge key press
if(KEY_LINE_1 == 1)
{
for(t = 0; t < 1000; t ++) ;
if(KEY_LINE_1 == 1) //Line1 Pressed
flag = 1;
}
else if(KEY_LINE_2 == 1)
{
for(t = 0; t < 1000; t ++) ;
if(KEY_LINE_2 == 1) //Line2 Pressed
flag = 2;
}
else if(KEY_LINE_3 == 1)
{
for(t = 0; t < 1000; t ++) ;
if(KEY_LINE_3 == 1) //Line3 Pressed
flag = 3;
}
else if(KEY_LINE_4 == 1)
{
for(t = 0; t < 1000; t ++) ;
if(KEY_LINE_4 == 1) //Line4 Pressed
flag = 4;
}
else if(KEY_LINE_5 == 1)
{
for(t = 0; t < 1000; t ++) ;
if(KEY_LINE_5 == 1) //Line5 Pressed
flag = 5;
}
else if(KEY_LINE_6 == 1)
{
for(t = 0; t < 1000; t ++) ;
if(KEY_LINE_6 == 1) //Line6 Pressed
flag = 6;
}
////////////////////////////////////////////////
switch(flag)
{
case 1: //显示 切换
if(swVideoWord == 0)
{
swVideoWord = 1;
ControlLcd(1, 1, 1);
}
else
{
swVideoWord = 0;
ControlLcd(0, 1, 1);
}
break;
case 2: //输入通道切换
if(switchInput == 0)
{
SAAreg[2] = 0xc0;
ConfigSAA7111A();
switchInput = 1;
}
else
{
SAAreg[2] = 0xc2;
ConfigSAA7111A();
switchInput = 0;
}
break;
case 3: //亮度增加
//write frontcolor(black)
WriteSingleDataToLcd(4, 0x00, 0);
Write3Digit(200, 200, SAAreg[10]);
if(SAAreg[10] < 198)
SAAreg[10] += 1;
ConfigSAA7111A();
//write frontcolor(blue)
WriteSingleDataToLcd(4, 0x03, 1);
Write3Digit(200, 200, SAAreg[10]);
break;
case 4: //亮度减小
//write frontcolor(black)
WriteSingleDataToLcd(4, 0x00, 0);
Write3Digit(200, 200, SAAreg[10]);
if(SAAreg[10] > 61)
SAAreg[10] -= 1;
ConfigSAA7111A();
//write frontcolor(blue)
WriteSingleDataToLcd(4, 0x03, 1);
Write3Digit(200, 200, SAAreg[10]);
break;
case 5://对比度增加
//write frontcolor(black)
WriteSingleDataToLcd(4, 0x00, 0);
Write3Digit(200, 220, SAAreg[11]);
if(SAAreg[11] < 120)
SAAreg[11] += 1;
ConfigSAA7111A();
//write frontcolor(blue)
WriteSingleDataToLcd(4, 0x03, 1);
Write3Digit(200, 220, SAAreg[11]);
break;
case 6://对比度减小
//write frontcolor(black)
WriteSingleDataToLcd(4, 0x00, 0);
Write3Digit(200, 220, SAAreg[11]);