首先:我先说下这个的难点,这个是两个程序往一起摄,摄不了也得摄,我就用EXTERN哈,也不必费劲的搞H
但这还不算难点,难点是那个带小数点的显示我又搞了两个晚上。上图哈:(又是大奔拍地,照像机老忘拿回下次注意)
我先说我的显示是什么
:
the volate is:
1.6**
因为我采样是1.6伏多点后两位显示什么不一定反证是1.6几,有一次是1.663好象来这
不费话了上图先
上程序:
5110部分
#include <LM3Sxxx.H>
#include "english_6x8_pixel.h"
#include "DriverLCD_Nokia5110.h"
#include "gpio.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define true 1
#define flase 0
/*-----------------------------------------------------------------------
LCD_init : 3310LCD初始化
编写日期 :2004-8-10
最后修改日期 :2004-8-10
-----------------------------------------------------------------------*/
#define LCD_DC GPIO_PIN_0 // PA
#define LCD_RST GPIO_PIN_7
#define LCD_SCLK GPIO_PIN_1 //PA时钟信号
#define LCD_SDIN GPIO_PIN_6 //数据输入
#define LCD_CE GPIO_PIN_5 //
#define c_Lcd_Max_x 84
#define c_Lcd_Max_y 6 //以字节为单位
#define c_LCD_Max_Dot_X 84
#define c_LCD_Max_Dot_Y 48
#define COM 0 //指令
#define DAT 1 //数据
//-------------------
#define STR 1 //字符
#define HAN 2 //汉字
//--------------------------LPH7366指令集---------------------------
#define Nokia5110_basic_fun_set 0x20 //基本功能设置
#define Nokia5110_expand_fun_set 0x21 //扩展功能设置
// D7 D6 D5 D4 D3 D2 D1 D0
// 0 0 1 0 0 PD V H
// | | |_______1->扩展指令集 0->基本指令集
// | |___________1->垂直寻址 0->水平寻址
// |_______________1->低功耗模式 0->正常模式
//-------------------------------------------------------------------
//基本指令集
#define Nokia5110_dis_set 0x0c//显示模式设置
#define Nokia5110_DispMode_AllLightOff 0x08
#define Nokia5110_DispMode_AllLightOn 0x09
#define Nokia5110_DispMode_Reverse 0x0d
// D7 D6 D5 D4 D3 D2 D1 D0
// 0 0 0 0 1 D 0 E
// | |_______0 0 1 1
// |_______________0 1 0 1
// 白屏 正常显示 全显 反转
//-------------------------------------------------------------------
#define Nokia5110_add_Yset 0x40 //设置Y地址
// D7 D6 D5 D4 D3 D2 D1 D0
// 0 1 0 0 0 Y1 Y2 Y3
//-------------------------------------------------------------------
#define Nokia5110_add_Xset 0x80 //设置X地址
// D7 D6 D5 D4 D3 D2 D1 D0
// 0 1 X6 X5 X4 X3 X2 X1
//-------------------------------------------------------------------
//扩展指令集
#define Nokia5110_tem_set 0x06 //温度系数设置
// D7 D6 D5 D4 D3 D2 D1 D0
// 0 0 0 0 0 1 TC1 TC0
//-------------------------------------------------------------------
#define Nokia5110_vot_set 0xBF //电压系数设置 0xD7
// D7 D6 D5 D4 D3 D2 D1 D0
// 1 vo6 vo5 vo4 vo3 vo2 vo1 vo0
//-------------------------------------------------------------------
//void Delay_1uS(void);
void delay_1us(void) //1us延时函数
{
unsigned int i;
for(i=0;i<1;i++);
}
//1ms Delayfunction
void Delay(uint uiDelayCount)
{
uint uiTempCount;
uint uci;
for(uiTempCount=0; uiTempCount<uiDelayCount; uiTempCount++)
{
uci = 1000;
while(uci--)
{
delay_1us();
}
}
}
/*-----------------------------------------------------------------------
LCD_write_byte : 使用SPI接口写数据到LCD
输入参数:data :写入的数据;
command :写数据/命令选择;
编写日期 :2004-8-10
最后修改日期 :2004-8-13
-----------------------------------------------------------------------*/
void LCD_write_CMD(unsigned char ucWriteData)
{
unsigned char uci;
GPIOPinWrite(GPIO_PORTC_BASE, LCD_CE,~LCD_CE);
GPIOPinWrite(GPIO_PORTA_BASE, LCD_DC,~LCD_DC);
for(uci=0;uci<8;uci++)
{
if(ucWriteData & 0x80)
{
GPIOPinWrite(GPIO_PORTC_BASE, LCD_SDIN,LCD_SDIN);
}
else
{
GPIOPinWrite(GPIO_PORTC_BASE, LCD_SDIN,~LCD_SDIN);
}
GPIOPinWrite(GPIO_PORTA_BASE, LCD_SCLK,~LCD_SCLK);
ucWriteData = ucWriteData << 1;
GPIOPinWrite(GPIO_PORTA_BASE, LCD_SCLK,LCD_SCLK);
}
//LCD_CE = 1;
GPIOPinWrite(GPIO_PORTC_BASE, LCD_CE,LCD_CE);
}
/*-----------------------------------------------------------------------
LCD_write_byte : 使用SPI接口写数据到LCD
输入参数:data :写入的数据;
command :写数据/命令选择;
编写日期 :2004-8-10
最后修改日期 :2004-8-13
-----------------------------------------------------------------------*/
void LCD_write_Data(unsigned char ucWriteData)
{
unsigned char uci;
GPIOPinWrite(GPIO_PORTC_BASE, LCD_CE,~LCD_CE);
GPIOPinWrite(GPIO_PORTA_BASE, LCD_DC,LCD_DC);
for(uci=0;uci<8;uci++)
{
if(ucWriteData & 0x80)
{
GPIOPinWrite(GPIO_PORTC_BASE, LCD_SDIN,LCD_SDIN);
}
else
{
GPIOPinWrite(GPIO_PORTC_BASE, LCD_SDIN,~LCD_SDIN);
}
GPIOPinWrite(GPIO_PORTA_BASE, LCD_SCLK,~LCD_SCLK);
ucWriteData = ucWriteData << 1;
GPIOPinWrite(GPIO_PORTA_BASE, LCD_SCLK,LCD_SCLK);
}
GPIOPinWrite(GPIO_PORTC_BASE, LCD_CE,LCD_CE);
}
/*-----------------------------------------------------------------------
LCD_set_XY : 设置LCD坐标函数
输入参数:X -83
Y :0-5
编写日期 :2004-8-10
最后修改日期 :2004-8-10
-----------------------------------------------------------------------*/
void LCD_set_XY(unsigned char X, unsigned char Y)
{
LCD_write_CMD(0x40 | (Y & 0X07)); // column
LCD_write_CMD(0x80 | (X & 0X7F)); // row
}
/*-----------------------------------------------------------------------
LCD_clear : LCD清屏函数
-----------------------------------------------------------------------*/
void LCD_Clear(void)
{
uint uii;
LCD_set_XY(0,0);
for(uii=0; uii<c_Lcd_Max_x * c_Lcd_Max_y; uii++)
{
LCD_write_Data(0x00);
}
}
void LCD_Init(void)
{
GPIOPinWrite(GPIO_PORTC_BASE, LCD_CE,~LCD_CE);
GPIOPinWrite(GPIO_PORTC_BASE, LCD_RST,~LCD_RST);
delay_1us();
GPIOPinWrite(GPIO_PORTC_BASE, LCD_RST,LCD_RST);
delay_1us();
delay_1us();
LCD_write_CMD(0x21); // 使用扩展命令设置LCD模式
LCD_write_CMD(Nokia5110_vot_set);
LCD_write_CMD(0x06); // 温度校正
LCD_write_CMD(0x13); // 1:48
LCD_write_CMD(0x20); // 使用基本命令
LCD_Clear(); // 清屏
LCD_write_CMD(0x0c); // 设定显示模式,正常显示
GPIOPinWrite(GPIO_PORTC_BASE, LCD_CE,LCD_CE);
}
/*-----------------------------------------------------------------------
LCD_write_char : 显示英文字符
输入参数:c :显示的字符;
编写日期 :2004-8-10
最后修改日期 :2004-8-10
-----------------------------------------------------------------------*/
void LCD_write_char(unsigned char c)
{
unsigned char line;
c -= 32;
for (line=0; line<6; line++)
{
LCD_write_Data(font6x8[c][line]);
}
}
/*-----------------------------------------------------------------------
LCD_write_english_String : 英文字符串显示函数
输入参数:*s :英文字符串指针;
X、Y : 显示字符串的位置,x 0-83 ,y 0-5
编写日期 :2004-8-10
最后修改日期 :2004-8-10
-----------------------------------------------------------------------*/
void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
{
LCD_set_XY(X,Y);
while (*s)
{
LCD_write_char(*s);
s++;
}
}
void TestLCD_Nokia5110(void)
{
LCD_Init(); //初始化液晶
LCD_Clear();
while(1)
{
LCD_write_english_string(0,0,"NOKIA 5110 LCD");
Delay(100);
LCD_write_english_string(0,2,"Designed by :");
Delay(100);
LCD_write_english_string(0,3," DDLLXXRR ");
Delay(100);
LCD_write_english_string(0,5," Very Good!");
Delay(1000);
LCD_Clear();
Delay(100);
}
}
void init(void)
{
//SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
// SYSCTL_XTAL_6MHZ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 );
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
}
ADC部分:
#include <LM3Sxxx.H>
#include <systick.h>
#include <adc.h>
#include <stdio.h>
#define ADCSequEnable ADCSequenceEnable
#define ADCSequDisable ADCSequenceDisable
#define ADCSequConfig ADCSequenceConfigure
#define ADCSequStepConfig ADCSequenceStepConfigure
#define ADCSequDataGet ADCSequenceDataGet
tBoolean ADC_EndFlag = false; // 定义ADC转换结束的标志
extern void init(void);
extern void LCD_Init(void);
extern void LCD_write_english_string(unsigned char X,unsigned char Y,char *s);
unsigned long ulVal;
// 防止JTAG失效
void jtagWait(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); // 使能KEY所在的GPIO端口
GPIOPinTypeGPIOInput(GPIO_PORTC_BASE,GPIO_PIN_4); // 设置KEY所在管脚为输入
if (GPIOPinRead(GPIO_PORTC_BASE,GPIO_PIN_4) == 0x00) // 若复位时按下KEY,则进入
{
while(1); // 死循环,以等待JTAG连接
}
SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOC); // 禁止KEY所在的GPIO端口
}
// ADC初始化
void adcInit(void)
{
SysCtlLDOSet(SYSCTL_LDO_2_75V); //配置PLL前需将LDO电压设置为2.75V
SysCtlClockSet(SYSCTL_USE_PLL | // 系统时钟设置,采用PLL
SYSCTL_OSC_MAIN | // 主振荡器
SYSCTL_XTAL_6MHZ | // 外接6MHz晶振
SYSCTL_SYSDIV_4); // 分频结果为50MHz
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC); // 使能ADC模块
SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS); // 设置ADC采样速率
ADCSequDisable(ADC_BASE, 0); // 配置前先禁止采样序列
// 采样序列配置:ADC基址,采样序列编号,触发事件,采样优先级
ADCSequConfig(ADC_BASE, 0, ADC_TRIGGER_PROCESSOR, 0);
// 采样步进设置:ADC基址,采样序列编号,步值,通道设置
ADCSequStepConfig(ADC_BASE, 0, 0, ADC_CTL_CH0 |
ADC_CTL_END |
ADC_CTL_IE);
ADCIntEnable(ADC_BASE, 0); // 使能ADC中断
IntEnable(INT_ADC0); // 使能ADC采样序列中断
IntMasterEnable( ); // 使能处理器中断
ADCSequEnable(ADC_BASE, 0); // 使能采样序列
}
// ADC采样
unsigned long adcSample(void)
{
unsigned long ulValue;
ADCProcessorTrigger(ADC_BASE, 0); // 处理器触发采样序列
while (!ADC_EndFlag); // 等待采样结束
ADC_EndFlag = false; // 清除ADC采样结束标志
ADCSequDataGet(ADC_BASE, 0, &ulValue); // 读取ADC转换结果
return(ulValue);
}
// 主函数(程序入口)
int main(void)
{
unsigned char i;
char cBuf[8];
jtagWait( ); // 防止JTAG失效,重要!
init(); //管脚初始化
LCD_Init(); //LCD5110初使化
SysTickEnable( ); // 使能SysTick计数器
adcInit( ); // ADC初始化
LCD_write_english_string(0,1,"the volat is:");
for (;;)
{
ulVal = adcSample( ); // ADC采样
ulVal = (ulVal *3000UL)/1024UL; // 转换成电压值
for(i=0;i<8;i++)
{
cBuf = 32; //把不显示的地方添空格
}
cBuf[6]='V'; //显示伏
cBuf[2]='.'; //显示点
for(i=0;i<10;i++) //从数组末开始存储
{
if(i==3)
{
;
}
else
{
cBuf[5 - i] = (ulVal % 10) + 0x30; //从末位开始取
ulVal /= 10; //截取末位
}
if(ulVal==0)
break;
}
LCD_write_english_string(0,3,cBuf);
SysCtlDelay(1500);//* (SysTickValueGet( ) / 3000)); // 延时约1500ms
}
}
// ADC采样序列0的中断
void ADC_Sequence_0_ISR(void)
{
unsigned long ulStatus;
ulStatus = ADCIntStatus(ADC_BASE, 0, true); // 读取中断状态
ADCIntClear(ADC_BASE, 0); // 清除中断状态,重要
if (ulStatus != 0) // 如果中断状态有效
{
ADC_EndFlag = true; // 置位ADC采样结束标志
}
}
程序打包:
myADC5110.zip
(5.28 KB, 下载次数: 78)
[
本帖最后由 ddllxxrr 于 2011-6-9 19:42 编辑 ]