求教PIC单片机达人,关于数组和指针的

求教PIC单片机达人,关于数组和指针的,第1张

问题1:

方法1在常见编仔雹译器中会自动生成两个常量数组。方法2是自定义的变量数组。或许PICC中读写常量数组需要由专门的语法,我对PICC不太熟就不胡说八道了。

问题2:

这种现象的确比较特殊。按照C标准,字符串的结尾是应当自动添加0作为结束标志的卜戚含。型笑请阅读PICC的帮助文档,看看有没有这方面的相关设置。如果实在没有,只能在自己声明字符串数组时手动添加结束符,如

uchar name[] = "name\0"

/*************************************************

名称:LCD12864_ST7920并行测试程序

试验功能:测试基于ST7920控制芯片的LCD12864的显示

并行方式连接;晶振11.0592M

编写:JiangX.net

*************************************************/

#include <reg52.h>

#include <ziku.h>

#include <intrins.h>

#include <string.h>

#define uchar unsigned char

#define uint unsigned int//宏定义

#define ulong unsigned long

#define Channal_A 1//通道A

#define Channal_B 2//通道B

#define Channal_AB3//通道A&B

//**************************一下为函数声明修**************************************

static void DA_conver(uint Dignum)

extern void Write_A_B(uint Data_A,uint Data_B,uchar Channal,bit Model)

//**************************修改硬件时要修改的部分********************************

sbit DIN = P0^0//数据输入端

sbit SCLK = P0^1//时钟信号

sbit CS= P0^2//片选输入端,低电平有效

/*MAX187接口定义*/

sbit MAX187_CS= P2^6

sbit MAX187_DO= P2^5

sbit MAX187_SK= P2^7

/*****13864LCD接口定义*****/

sbit LCD_RS = P3^7//1:输入数据 ;0:输入命前庆野令

sbit LCD_RW = P2^7//1:读数据 0:写数据

sbit LCD_EN = P2^6//LCM使能端

sbit LCD_PSB = P2^3//串并口选择 1:并口模式0:串口模式

#define LCD_DATA P1 //LCD总线端口

/*****LCD功能初始化指令*****/

#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H

#define AC_INIT 0x02 //将AC设置为00H。且游标移到原点位置

#define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向(差弊默认游标右移,图像整体不动)

#define FUN_MODE 0x30 //工作模式:8位基本指令集

#define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白

#define DISPLAY_OFF 0x08 //显示关

#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1

#define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH

#define SET_DD_AC 0x80

/*****汉字地址表*****/

uchar code addr_tab[]={ //便于根据汉字坐标求出地址

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,//第四行汉字位置

}

//------------全局变量定义-------------

uchar first[]="MAX187 "

uchar show187[]="12345"

//uchar code shw187[]="123456"

uchar error[]="ERROR!"

ulong vv

/*****n(ms)延时子程序*****/

void delayms(uint t) //约延时n(ms)

{

uint i

while(t--)

{

for(i=0i<125i++)

}

}

/*****等待LCD忙*****/

void WaitBusy(void) //延时一小段时间,等待LCD空闲

{

uchar i=5

while(i--)

}

/*****写指令代码*****/

void Lcd_WriteCmd(uchar cmdcode)

{

LCD_RS = 0

LCD_RW = 0

LCD_EN = 1

WaitBusy()

LCD_DATA = cmdcode

LCD_EN = 0

}

/*****写数据*****/

void Lcd_WriteData(uchar dispdata)

{

LCD_RS = 1

LCD_RW = 0

LCD_EN = 1

WaitBusy()

LCD_DATA = dispdata

LCD_EN = 0

}

/*****初始化LCD*****/

void Lcd_Init()

{

LCD_PSB = 1

delayms(50)

Lcd_WriteCmd(0x30) //选择基本指令集

delayms(1)

Lcd_WriteCmd(0x30) //选择8bit数据流

delayms(1)

Lcd_WriteCmd(0x0c) //开显示(无游标、不反白)

delayms(1)

Lcd_WriteCmd(0x01) //清除显示,并且设定地址指针为00H

delayms(20)

}

/*****显示汉字*****/

void hanzi_Disp(uchar x,uchar y,uchar *s)

{ //x、y为汉字坐标

Lcd_WriteCmd(addr_tab[8*x+y]) //写地址

while(*s>0)

{

Lcd_WriteData(*s) //写数据

s++

}

}

/*****显示图片(显示Gdram内容)*****/

/*绘图显示的步骤

1 关闭绘图显示功能

2 先将垂直的坐标(Y)写入绘图RAM地址

3 再将水平的位元组坐标(X)写入绘图RAM地址

4 将D15-D8写入RAM中

5 将D7-D0写入到RAM中

6 打开绘图显示功能*/

//图片取模方式:横向取模,字节正序

void pic_Disp(uchar *pic)//显示Gdram内容(显示图片)

{

uchar x,y,i

for(i=0i<9i=i+8)

for(y=0y<32y++)

{

for(x=0x<8x++)

{

Lcd_WriteCmd(0x36) //扩充指令,开绘图显示

Lcd_WriteCmd(0x80+y) //行地址

Lcd_WriteCmd(0x80+x+i) //列地址

Lcd_WriteData(*pic++) //写数据 D15-D8

Lcd_WriteData(*pic++) //写数据 D7-D0

Lcd_WriteCmd(0x30)

}

}

}

/*max187延时程序*/

void delay_MS(uint ms)//普通延时MS级

{ uint i,j

for(i=0i<msi++)

{for(j=0j<1141j++)}

}

void delay_uS(uint us)//普通延时US级

{ uint i,j

for(i=0i<usi++)

{ for(j=0j<10j++)}

}

//MAX187读程序

unsigned int MAX187read(void)

{

uchar H,L,i

uint count //16位变量

MAX187_CS=0 //低电平有效,开始转换

delay_uS(2) //延时8.5μ等待转换结束

MAX187_SK=1

MAX187_SK=0

H=0//高位变量清零

for(i=0i<4i++) //高4位

{

MAX187_SK=1

if(MAX187_DO) H++ //位标量,如为1则H加1,如为0则跳过

MAX187_SK=0

if(i!=3)

H<<=1

}

L=0

for(i=0i<8i++) //低8位

{

MAX187_SK=1

if(MAX187_DO) L++ //位标量,如为1则L加1,如为0则跳过

MAX187_SK=0

if(i!=7)

L<<=1

}

delay_uS(1)

MAX187_CS=1

count=0

count=L

return count

}

void MAX187_data()

{

vv=MAX187read()

vv=vv*2*4096/4093

show187[0]=vv/1000+'0'

show187[1]='.'

show187[2]=vv/100%10+'0'

show187[3]=vv/10%10+'0'

show187[4]=vv%10+'0'

show187[5]='\0'

}

/*****主函数*****/

void main(void)

{

uchar volt,number

number=2

volt=0x30+number

Lcd_Init()

while(1)

{

Lcd_Init()

hanzi_Disp(0,1,"山东天工机电")

hanzi_Disp(1,2,"智能充电机")

hanzi_Disp(2,0,"www.sdtgjd.com")

hanzi_Disp(3,3,"")

delayms(1000)

Lcd_Init()

hanzi_Disp(1,2,"充电电流:")

//delayms(500)

//Lcd_Init()

MAX187_data()

hanzi_Disp(2,3,show187)

delayms(1500)

Write_A_B(0x0fff,0x0000,Channal_A,0) //测量A通道

//Write_A_B(0x0000,0x0600,Channal_B,1) //测量B通道

// Write_A_B(0x0504,0x0a47,Channal_AB,1) //测量AB通道,测量时需屏蔽上面两句

//while(1)

}

}

//=================================================================

// 函数名称 :void DA_conver(uint Dignum)

// 函数功能 :进行DA转换

// 入口参数 :Dignum:根据说明设置转化数据.头四位为特殊位用于选择转化方式,

//以及用于通道选择.请自行设置.后12位为需要转换的值

// 出口参数 :无

//=================================================================

void DA_conver(uint Dignum)

{

uint Dig=0

uchar i=0

SCLK=1

CS=0 //片选有效

for(i=0i<16i++) //写入16为Bit的控制位和数据

{

Dig=Dignum&0x8000

if(Dig)

{

DIN=1

}

else

{

DIN=0

}

SCLK=0

_nop_()

Dignum<<=1

SCLK=1

_nop_()

}

SCLK=1

CS=1 //片选无效

}

//=================================================================

// 函数名称 :void Write_A_B(uint Data_A,uint Data_B,uchar Channal,bit Model)

// 函数功能 :模式、通道选择并进行DA转换

// 入口参数 :Data_A:A通道转换的电压值

//Data_B:B通道转换的电压值

//Channal:通道选择,其值为Channal_A,Channal_B,或Channal_AB

//Model:速度控制位 0:slow mode 1:fast mode

// 出口参数 :无

// 说明: Data_A,Data_B的范围为:0-0x0fff

//本程序如果只需要一个通道时,另外一个通道的值可任意,但是不能缺省

//=================================================================

void Write_A_B(uint Data_A,uint Data_B,uchar Channal,bit Model)

{

uint Temp

if(Model)

{

Temp=0x4000

}

else

{

Temp=0x0000

}

switch(Channal)

{

case Channal_A: //A通道

DA_conver(Temp|0x8000|(0x0fff&Data_A))

break

case Channal_B: //B通道

DA_conver(Temp|0x0000|(0x0fff&Data_B))

break

case Channal_AB:

DA_conver(Temp|0x1000|(0x0fff&Data_B)) //A&B通道

DA_conver(Temp|0x8000|(0x0fff&Data_A))

break

default:

break

}

}

我专门给你编了个PIC16F1823的C程序,用的是PICC9.8。

其配置位的含义,请把这些程序编译后在MPLAB IDE的配置位窗口看,就知道了。

程序实现对一个端口的LED闪亮功能,图为在PROTEUS仿裂伍真的结果,证明结果是正确的,我用的是PROTEUS7.9的,低的版本没有这个单片机。

#include <pic.h>

//第一个配置设置为:振荡器为内部RC,各种功肆袜或能(看门狗,上电定时器等)

__CONFIG(0x09E4)

//第二个配置设置为:关闭PLL锁相环,掉电复位电压为2.4V,低电压写使能

__CONFIG(0x3EFF)

#define LED RA5

void DELAY(unsigned int)

void main(void)

{ //未对ODSCCON设置,即用默认的500kHz的内部振荡器,指令周期为8us

TRISA5=0

LED=1

while(1)

{ DELAY(3)

LED=!LED

}

}

void 好宴DELAY(unsigned int n)

{ unsigned int i

for (i=0i<ni++)

{ NOP()

NOP()

NOP()

NOP()

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12396785.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存