IMG_20170509_161859.jpg (193.66 KB, 下載次數: 131)
下載附件
2017-5-9 16:22 上傳
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define SPI_S0 0x04
#define SPI_S1 0x08
#define SPIF 0x80 //SPSTAT.7
#define WCOL 0x40 //SPSTAT.6
#define SSIG 0x80 //SPCTL.7
#define SPEN 0x40 //SPCTL.6
#define DORD 0x20 //SPCTL.5
#define MSTR 0x10 //SPCTL.4
sfr P4 = 0xC0; //1111,1111 端口4
sfr P5 = 0xC8; //xxxx,1111 端口5
sfr P6 = 0xE8; //0000,0000 端口6
sfr P7 = 0xF8; //0000,0000 端口7
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
sfr IE2 = 0xaf; //中斷使能寄存器2
sfr AUXR = 0x8e; //輔助寄存器
sfr T2H = 0xD6; //定時器2高8位
sfr T2L = 0xD7; //定時器2低8位
sfr P_SW1 = 0xa2; //外設功能切換寄存器1
sfr SPSTAT = 0xcd; //SPI狀態寄存器
sfr SPCTL = 0xce; //SPI控制寄存器
sfr SPDAT = 0xcf; //SPI數據寄存器
sbit SS = P2^4; //LCD5110 片選 接51的SPI_SS (不可隨意改動)
sbit res = P0^7; //LCD5110 復位,0復位 (可隨意改動)
sbit dc = P0^5; //LCD5110 1寫數據,0寫指令 (可隨意改動)
//sbit sdin = P2^3; //LCD5110 數據 接51的SPI_MOSI(不可隨意改動)
//sbit sclk = P2^1; //LCD5110 時鐘 接51的SPI_CLK (不可隨意改動)
const unsigned char code F6x8[][6] =
{
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp 0
{ 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // ! 1
{ 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // " 2
{ 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # 3
{ 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ 4
{ 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, // % 5
{ 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, // & 6
{ 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' 7
{ 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( 8
{ 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) 9
{ 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 }, // * 10
{ 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 }, // + 11
{ 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 }, // , 12
{ 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 }, // - 13
{ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, // . 14
{ 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 }, // / 15
{ 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0 16
{ 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1 17
{ 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 18
{ 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3 19
{ 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4 20
{ 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 21
{ 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6 22
{ 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 23
{ 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 24
{ 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9 25
{ 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, // : 26
{ 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; 27
{ 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, // < 28
{ 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, // = 29
{ 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, // > 30
{ 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? 31
{ 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E }, // @ 32
{ 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, // A 33
{ 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B 34
{ 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C 35
{ 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D 36
{ 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E 37
{ 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F 38
{ 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G 39
{ 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H 40
{ 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I 41
{ 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J 42
{ 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K 43
{ 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L 44
{ 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M 45
{ 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N 46
{ 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O 47
{ 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P 48
{ 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q 49
{ 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R 50
{ 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // S 51
{ 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T 52
{ 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U 53
{ 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V 54
{ 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W 55
{ 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // X 56
{ 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y 57
{ 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z 58
{ 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [ 59
{ 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55 60
{ 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ] 61
{ 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ 62
{ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ 63
{ 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // ' 64
{ 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, // a 65
{ 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b 66
{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c 67
{ 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, // d 68
{ 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 }, // e 69
{ 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f 70
{ 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C }, // g 71
{ 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h 72
{ 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i 73
{ 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 }, // j 74
{ 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k 75
{ 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l 76
{ 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m 77
{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n 78
{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o 79
{ 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 }, // p 80
{ 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC }, // q 81
{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r 82
{ 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s 83
{ 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t 84
{ 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u 85
{ 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v 86
{ 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w 87
{ 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x 88
{ 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y 89
{ 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z 90
{ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 } // = 91
};
void Delayms(uint ms) [url=]//1mS@12.000MHz[/url]
{ unsigned char i, j;
while(ms--){
i = 12;
j = 169;
do
{
while (--j);
} while (--i);}
}
void InitSpi()
{
ACC = P_SW1; //可用于測試U7,U7使用的是第二組SPI控制Flash
ACC &= ~(SPI_S0 | SPI_S1); //SPI_S0=1 SPI_S1=0
ACC |= SPI_S0; //(P2.4/SS_2, P2.3/MOSI_2, P2.2/MISO_2, P2.1/SCLK_2)
P_SW1 = ACC;
SPSTAT = SPIF | WCOL; //清除SPI狀態
SS = 1;
SPCTL = SSIG | SPEN | MSTR; //設置SPI為主模式
}
void LCD_write_byte(unsigned char dt, unsigned char command)//LCD5110寫入數據
{
SS = 0;
dc=command; // 0是寫命令,1是寫數據
SPDAT = dt; //觸發SPI發送
while (!(SPSTAT & SPIF)); //等待SPI數據傳輸完成
SPSTAT = SPIF | WCOL; //清除SPI狀態
SS = 1;
}
void LCD_clear(void) //5110LCD清屏
{
unsigned int i;
LCD_write_byte(0x0c, 0);
LCD_write_byte(0x80, 0);
for (i=0; i<504; i++)
LCD_write_byte(0, 1);
}
void LCD_set_XY(unsigned char X, unsigned char Y) //x 左右共0~83列可移,Y由上至下共0~5行可移
{
LCD_write_byte(0x40 | Y, 0); // column Y+=64
LCD_write_byte(0x80 | X, 0); // row X+=128
}
void LCD_init(void) //5110LCD初始化LCD_init
{
res=0; // 產生一個讓LCD復位的低電平脈沖
Delayms(10);
res=1;
SS = 0; // 關閉LCD
Delayms(10);
SS = 1;// 使能LCD
Delayms(10);
LCD_write_byte(0x21, 0); // 使用擴展命令設置LCD模式
LCD_write_byte(190, 0); // 設置偏置電壓
LCD_write_byte(0x06, 0); // 溫度校正
LCD_write_byte(0x13, 0); // 1:48
LCD_write_byte(0x20, 0); // 使用基本命令
LCD_clear(); // 清屏
LCD_write_byte(0x0C, 0); // 設定顯示模式,正常顯示
SS = 0; // 關閉LCD
}
void LCD_P6x8Str(unsigned char x,unsigned char y,unsigned char ch)
{
unsigned char i;
LCD_set_XY(x,y);
for(i=0;i<6;i++){
LCD_write_byte(F6x8[ch],1);}
}
void LCD_P6x8Str3wita(unsigned char x,unsigned char y,unsigned char dat)
{
LCD_P6x8Str(x,y,16+dat/100%10);
LCD_P6x8Str(x+6,y,16+dat/10%10);
LCD_P6x8Str(x+12,y,16+dat%10);
}
void main(void)
{
unsigned char x,y,z,k,h;
unsigned char max[5],s1,s2,s3;
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
InitSpi();
LCD_init();
//x=6,y=7,z=8,k=9,h=10;
//x=10,y=6,z=7,k=8,h=9;
//x=9,y=10,z=6,k=7,h=8;
//x=8,y=9,z=10,k=6,h=7;
//x=7,y=8,z=9,k=10,h=6;
//x=10,y=6,z=9,k=8,h=7;
//x=8,y=10,z=8,k=7,h=6;
x=7,y=10,z=6,k=9,h=8;
max[0]=x;
max[1]=y;
max[2]=z;
max[3]=k;
max[4]=h;
for(s2=0;s2<5;s2++)
{
if(x==max[s2]){LCD_P6x8Str(0,s2,88);LCD_P6x8Str3wita(12,s2,x);}else
if(y==max[s2]){LCD_P6x8Str(0,s2,89);LCD_P6x8Str3wita(12,s2,y);}else
if(z==max[s2]){LCD_P6x8Str(0,s2,90);LCD_P6x8Str3wita(12,s2,z);}else
if(k==max[s2]){LCD_P6x8Str(0,s2,75);LCD_P6x8Str3wita(12,s2,k);}else
if(h==max[s2]){LCD_P6x8Str(0,s2,72);LCD_P6x8Str3wita(12,s2,h);}
}
for(s1=0;s1<4;s1++)
{
for(s2=0;s2<4-s1;s2++)
{
if(max[s2]<max[s2+1])
{
s3=max[s2];
max[s2]=max[s2+1];
max[s2+1]=s3;
}
}
}
for(s2=0;s2<5;s2++)
{
if(x==max[s2]){LCD_P6x8Str(48,s2,88);LCD_P6x8Str3wita(60,s2,x);}else
if(y==max[s2]){LCD_P6x8Str(48,s2,89);LCD_P6x8Str3wita(60,s2,y);}else
if(z==max[s2]){LCD_P6x8Str(48,s2,90);LCD_P6x8Str3wita(60,s2,z);}else
if(k==max[s2]){LCD_P6x8Str(48,s2,75);LCD_P6x8Str3wita(60,s2,k);}else
if(h==max[s2]){LCD_P6x8Str(48,s2,72);LCD_P6x8Str3wita(60,s2,h);}
}
while(1);
}
|